Abstract

This paper builds upon previous literature for modeling value-at-risk quantiles that uses an ARMA-style approach by adding ETFs as explanatory variables that are combined into principal component vectors at the forecast origin. By combining these principal component vectors along with various transformations of lagged autoregressive response variables, similar predictive accuracy is achieved (relative to the univariate model) and a clearer interpretation is gained. In fact, this thesis proposes an algorithm to detect changepoints in the explanatory variables that could be used as a means to measure changepoints in the economy. [DELETE IF THE CHANGEPOINT ARGUMENT DOESN’T MAKE SENSE.]

Background and Introduction

When modeling financial time series, simply considering the mean and the variance is insufficient. In fact, modeling a 1% or a 5% quantile of daily returns is a way to understand what happens on the worst days and to have a clearer picture of what might happen during a downturn. Indeed, finance theory suggests that the reasons why stocks earn a x% real return (CITE) after taxes and inflation over very long periods of time is because of the fact that there might be a significant downturn in asset prices.

One way to understand downside risk is using value-at-risk (VaR); a one-day 1% VaR of -1 million dollars for a portfolio means that the portfolio will lose at least $1 million on the 1% worst trading days. A major advantage of VaR is that it distills a distribution of returns into one number. As such, VaR is often used in stress testing by regulatory agencies (CITE?).

Many of the approaches for modeling VaR rely on a semiparametric or a nonparametric historical simulation1. According to Robert Engle and Simone Manganelli in a 2004 paper, these methods are usually chosen for “empirical justifications rather than on sound statistical theory”2. As such, they propose a framework called CAViaR that forecasts the VaR quantile directly using a conditional autoregressive quantile specification. This approach builds upon the statistical literature that extends linear quantile models to settings amenable to financial modeling, such as with heteroskedastic and nonstationary error distributions3,4.

My analysis of this model shows that it performed well on the test sample – the last 200 trading days of 2008 – for a stock like Amazon that was highly volatile during the training sample, which included data from previous years. However, the forecast performs poorly for a stock like Proctor & Gamble (PG) that was less volatile during the training sample. Both stocks were highly volatile during the late stages of 2008, but because of the non-representative training sample for PG, the model significantly underestimated the riskiness of PG. Therefore, I propose developing a model that combines stocks into a multivariate setting to capture correlations to improve forecast accuracy. I want to extend a diffusion index model, originally developed by Stock and Watson for predicting conditional means, to the domain of a quantile regression to forecast VaR5,6. Initial work that I have done shows the diffusion index model is useful in predicting the mean returns of the SPY using U.S. sector ETFs as predictors. For this reason, I suspect that using portfolio components in the same fashion to predict a specific quantile will be useful as well, and I plan to develop theoretical guarantees about the distribution of parameters in this setting. I hope to conclude this work within my first year in the Ph.D. program.

Methods Used

Fill in.

Data Used

The response variable used in this analysis is SPY, which is an exchange-traded fund that aims to track the performance of the 500 largest market-capitalization stocks in the United States (CITE). It is broadly used as a bellweather of the U.S. economy (CITE), and has the advantage of avoiding survivorship bias - while an individual stock might go bankrupt or merge with another, it’s reasonable to assume that these issues do not apply with an ETF.

Following this logic, there are several classes of response variables used in this analysis. The first group is a set of U.S. sector ETFs obtained from Seeking Alpha using the link below. As with the response variable, these ETFs were publicly traded throughout the Great Recesssion.

https://seekingalpha.com/etfs-and-funds/etf-tables/sectors

  1. Utilities (XLU)
  2. Consumer Staples (XLP)
  3. Healthcare (XLV)
  4. Technology (XLK)
  5. Consumer Discretionary (XLY)
  6. Industrial (XLI)
  7. Financial Services (XLF)
  8. Basic Materials (XLB)
  9. Energy (XLE)

The second is Global Sector ETFs, also obtained from Seeking Alpha. The rationale for including these is that perhaps some global exposure is useful in understanding the broader market.

  1. Utilities (JXI)
  2. Consumer Staples (KXI)
  3. Healthcare (IXJ)
  4. Telecommunications (IXP)
  5. Technology (IXN)
  6. Consumer Discretionary (RXI)
  7. Industrial (EXI)
  8. Financial Services (IXG)
  9. Basic Materials (MXI)
  10. Energy (IXC)

The third is bond ETFs, also obtained from [CITE]. Like the previous two, these ETFs potentially contain forward-looking information about the stock market. Link below:

  1. iShares 1-3 Year Treasury Bond Fund (SHY)
  2. iShares 7-10 Year Treasury Bond Fund (IEF)
  3. iShares 20+ Year Treasury Bond Fund (TLT)
  4. iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

Lastly, all of the above are run together.

Results

CODE

Libraries

# Read in relevant libraries
library(microbenchmark)
library(data.table)
package ‘data.table’ was built under R version 3.5.2data.table 1.12.2 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
library(quantmod)
package ‘quantmod’ was built under R version 3.5.2Loading required package: xts
Loading required package: zoo
package ‘zoo’ was built under R version 3.5.2
Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘xts’

The following objects are masked from ‘package:data.table’:

    first, last

Loading required package: TTR
Version 0.4-0 included new data defaults. See ?getSymbols.
library(ggplot2)
package ‘ggplot2’ was built under R version 3.5.2
library(tseries)
package ‘tseries’ was built under R version 3.5.2
    ‘tseries’ version: 0.10-47

    ‘tseries’ is a package for time series analysis and computational
    finance.

    See ‘library(help="tseries")’ for details.
library(zoo)
library(magrittr)
library(dplyr)
package ‘dplyr’ was built under R version 3.5.2
Attaching package: ‘dplyr’

The following objects are masked from ‘package:xts’:

    first, last

The following objects are masked from ‘package:data.table’:

    between, first, last

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(kableExtra)
package ‘kableExtra’ was built under R version 3.5.2
Attaching package: ‘kableExtra’

The following object is masked from ‘package:dplyr’:

    group_rows
library(formattable)
library(quantreg)
package ‘quantreg’ was built under R version 3.5.2Loading required package: SparseM

Attaching package: ‘SparseM’

The following object is masked from ‘package:base’:

    backsolve
library(MTS)

Attaching package: ‘MTS’

The following object is masked from ‘package:TTR’:

    VMA
library(plot3D)
package ‘plot3D’ was built under R version 3.5.2
# Set up working directory
# setwd("~/Documents/GitHub/CaviaR")
# source('caviar_SM.R')
source('~/Documents/GitHub/CaviaR/caviar_SM.R')
Loading required package: Rcpp
package ‘Rcpp’ was built under R version 3.5.2The working directory was changed to /Users/stevenmoen/Documents/GitHub/CAViaR inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
# This code below is for use in the CAViaR sections.
# Here is code that I'll wrap some parts in to avoid superfluous output
quiet <- function(x) { 
  sink(tempfile()) 
  on.exit(sink()) 
  invisible(force(x)) 
} 

Univariate CAViaR Section

#' This is a function which pulls data for use in the CAViaR model
#'
#' @param symbol - symbol to pull
#' @param compl_case - defaults to true...only includes complete cases in the data
#' @param adj_close - use adjusted closing prices. Default is yes.
#' @param log_return - use log return? Default is yes.
#'
#' @return - a data frame which can be fed into later functions
#' @export
#'
#' @examples - data_pull("SPY")
data_pull = function(symbol, compl_case = 1, adj_close = 1, log_return = 1, start_date = "1900-01-01", end_date = Sys.Date()){
  # Pull in data from quantmod
  response_pull = getSymbols(symbol, auto.assign = FALSE, from = start_date, to = end_date)
  # Get adjusted closing price
  if (adj_close == TRUE){
    df = Ad(response_pull)
  } else {
    df = Cl(response_pull)
  }
  # Return complete cases only 
  if (compl_case == TRUE){
    df = df[complete.cases(df), ]
  } else{
    df = df
  }
  # Calculate log return of data
  if (log_return == TRUE){
    lr = log(df[,1]/shift(df[,1], 1, type = "lag"))
    # Combine data
    df_out = cbind(df, lr)
    # Rename the data 
    colnames(df_out) <- c(sym=symbol, paste0(symbol, "_log_return"))
  } else{
    df_out = df
  }
  # Return data
  return(df_out)
}
#' Pull the data and run the CAViaR function on it
#'
#' @param input_data - data to use in the function
#' @param range_data - range of the data to use
#'
#' @return - a list of values from the caviar function
#' @export
#'
#' @examples - caviar_pull(spy)
caviar_pull = function(input_data, range_data = (2:dim(input_data)[1])){
  # Run the caviar data
  caviar <- caviarOptim(input_data[range_data,2])
  return(caviar)
}
#' Function for producing rolling predictions
#' Model 1 = Symmetric Absolute Value, 2 = Asymmetric slope, 3 = Indirect GARCH, 4 = Adaptive
#'
#' @param input_data - input data from the previous function
#' @param range_data - range of the data to consider
#' @param nfcst - number of forecasts to make
#' @param model - model to use (integers 1 through 4). Defaults to 1. 
#' @param level - level of significance to use.
#' @param G - argument for the k parameter in the 4th model (adaptive). Default is 5
#'
#' @return - an xts object which contains rolling CAViaR predictions
#' @export
#'
#' @examples - rolling_predictions(spy, nfcst = 22)
rolling_predictions = function(input_data, range_data = (2:dim(input_data)[1]), nfcst = 250, model =1, level = 0.01, G = 5, col = 2){
  # Run the varpredict function
  varpredict <- rollapplyr(input_data[range_data,col], length(range_data) - nfcst, caviarOptim, model, level, predict = 1, k = G) %>% lag
  # Eliminate NAs
  # pred_no_na = na.omit(varpredict)
  # Return the data
  # return(pred_no_na)
  return(varpredict)
}
#' Function to Calculate Loss from the above predictions
#'
#' @param symbol - symbol to work with from quantmod. Must be in quotations to work
#' @param start_dt - start date of the data to build the forecast on 
#' @param end_dt - end date of the data to build the forecast on  
#' @param nfcst - number of data points to use in the forecast
#' @param model - model to use. Defaults to 1
#' @param level - level of significance. Defaults to 1%
#' @param G - argument for the k parameter in the 4th model (adaptive). Default is 5
#'
#' @return - loss using absolute value
#' @export - a plot of the data
#'
#' @examples
loss_calc_uv = function(symbol, start_dt, end_dt, nfcst, model = 1, level = 0.01, G = 5){
  # Pull in the data
  raw_data = data_pull(symbol, start_date = start_dt, end_date = end_dt)
  # Forecast based on the data
  fcst = na.omit(rolling_predictions(raw_data, nfcst = nfcst, model = model, level = level, G = G))*(-1)
  # Extract actuals
  act = tail(raw_data, n = nfcst)[,2]
  # Join the two together and rename
  join = merge(fcst,act,all=TRUE)
  colnames(join) <- c("Fcst_VaR", "Act_Return")
  # print(join)
  # Calculate the losses
  loss = abs(sum(ifelse(act > fcst, level, (-1)*(1-level))))
  # Plot the data
  plot = plot.xts(join, col = c("red", "black"), lty = c(2,1), main = "Log Return from the SPY vs. Fcst. VaR",grid.col = NA, legend.loc = "bottomleft")
  return(list(loss, plot, act, fcst))
}

MV Caviar - Pulling the data

#' This is a function which creates a data frame for the response and explanatory variables that we'll feed into the diffusion index
#'
#' @param symbol_list - a list of symbols recognizable by the 
#' @param resp_var - the response variable we'd like to forecast; default is SPY
#' @param compl_case - defaults to true...only includes complete cases in the data
#' @param adj_close - use adjusted closing prices for the explanatory variables? default is 1 for YES
#' @param resp_adj_close - use adjusted closing prices for the explanatory variables? default is 1 for YES
#' @param start_date - starting data to use
#' @param end_date - ending date of the data
#' @param lag_pred - do we lag the predictions? It is STRONGLY recommended that this is 0
#'
#' @return - a data frame which can be fed into the SWfore function
#' @export
#'
#' @examples - diff_index_df(c("XLF", "XLE", "PSCT", "XLV", "VPU", "XLP", "IGF", "XWEB", "PPTY"))
diff_index_df = function(symbol_list, resp_var = "SPY", compl_case = 1, adj_close = 1, resp_adj_close = 1, start_date = "1900-01-01", end_date = Sys.Date(), lag_pred = 1){
  # Pull in response variable
  response_pull = getSymbols(resp_var, auto.assign = FALSE, from = start_date, to = end_date)
  # Get adjusted closing price
  if (resp_adj_close == TRUE){
    diff_df = Ad(response_pull)
  } else {
    diff_df = Cl(response_pull)
  }
  # Loop through the symbols and join in data
  for (i in 1:length(symbol_list)){
    # Pull closing price
    expl_pull = getSymbols(symbol_list[i], auto.assign = FALSE, from = start_date, to = end_date)
    # Extract closing price - 4th element
    if (adj_close == TRUE){
      expl_cl = Ad(expl_pull)
    } else {
      expl_cl = Cl(expl_pull)
    }
    # New code for 4.16.2020 - lag the explanatory variables
    if (lag_pred == TRUE){
      # Lag the explanatory variables by 1
      lag_exp = lag(expl_cl, 1)
      # Append the first lag to the data frame
      diff_df = merge(diff_df, lag_exp, join = "left", fill = NA)
    } else{
      # Return the data frame without lags
      diff_df = merge(diff_df, expl_cl, join = "left", fill = NA)
    }
  }
  if (lag_pred == TRUE){
    # Chop off the first row
    diff_df = diff_df[-1,]
  }
  else {
    print("PLEASE NOTE - the explanatory variables in this DF are NOT lagged. Be careful to avoid look-ahead bias!")
  }
  # Return complete cases only 
  if (compl_case == TRUE){
    diff_df_out = diff_df[complete.cases(diff_df), ]
  } else{
    diff_df_out = diff_df
  }
  
  return(diff_df_out)
}
#' Converts a diff_df into a data frame with approximate percentage changes diff(log(diff_df))
#'
#' @param diff_df - output of the diff_index_df function with complete cases
#'
#' @return - retuns the differenced data
#' @export
#'
#' @examples - pc_diff_index(test_compl) 
pc_diff_index = function(diff_df){
  # Difference the log of the data
  pc_diff_index = diff(log(diff_df))
  # Remove the first row
  pc_diff_index_out = pc_diff_index[-1,]
  return(pc_diff_index_out)
}

MV Caviar - Modified DI code

The code that is used in a diffusion index model is as follows. The key is figuring out where to make the extension. I’ll go through and comment everything and see what’s what.

#' Below is the modified diffusion index code.
#'
#' @param y - response variable
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param m - number of diffusion indexes used
#' @param tau - VaR level to use; must be between 0 and 1
#' @param end - specifies an alternate ending value
#' @param print_mdl - print the model summary and the MSE
#'
#' @return - returns a list of variables for use in the diffusion index
#' @export
#'
#' @examples
mod_di = function (y, x, orig, m, tau, end = NULL, print_mdl = 0) 
{
  # Converts the response variables into a matrix
  if (!is.matrix(x)) 
      x = as.matrix(x)
  # nT is number of t time-steps
  nT = dim(x)[1]
  # Add a line to establish the number of data points used in the test.
  if (is.null(end) != TRUE){
    nT = end
  }
  # k is the number of diffusion indices used
  k = dim(x)[2]
  # Sanity checks to ensure that the origin isn't past the number of time points
  if (orig > nT) 
      orig = nT
  # Makes sure that there aren't more predictors than there variables in the dataset
  if (m > k) 
      m = k
  # Makes sure there are at least some variables
  if (m < 1) 
      m = 1
  # Subdivides the dataframe
  x1 = x[1:orig, ]
  # Calculates means of each row
  me = apply(x1, 2, mean)
  # Calculates standard deviations of each column
  se = sqrt(apply(x1, 2, var))
  # Creates a matrix x1, which normalizes all the columns. 
  # This may be an issue since it assumes that the distribution is sufficiently described by the first two moments
  x1 = x
  for (i in 1:k) {
      x1[, i] = (x1[, i] - me[i])/se[i]
  }
  V1 = cov(x1[1:orig, ])
  # Performs an eigen decomposition
  m1 = eigen(V1)
  # Selects eigenvalues
  sdev = m1$values
  # Selects eigenvectors
  M = m1$vectors
  # Makes a smaller matrix
  M1 = M[, 1:m]
  # This is the diffusion index model - [orig x p]*[p x m] = [orig x m]
  Dindex = x1 %*% M1
  # Cut down both the response and predictors to be a reasonable size
  y1 = y[1:orig]
  DF = Dindex[1:orig, ]
  # Apply the linear model - HERE is the key.
  # mm = lm(y1 ~ DF) - old function
  mm = rq(y1 ~ DF, tau = tau)
  # Print the data
  if (print_mdl == 1){
    print(summary(mm))
  }
  # Puts coefficients in a matrix
  coef = matrix(mm$coefficients, (m + 1), 1)
  # Initializes yhat variables and MSE
  yhat = NULL
  MSE = NULL
  if (orig < nT) {
    # Creates a nfcst by (m+1) matrix
    newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, 
        ])
    # [nfcstx(m+1)]*[(m+1)x1] = [nfcstx1]
    yhat = newx %*% coef
    # Calculates errors
    err = y[(orig + 1):nT] - yhat
    MSE = mean(err^2)
    if (print_mdl == 1){
      cat("MSE of out-of-sample forecasts: ", MSE, "\n")
    }
  }
  SWfore <- list(coef = coef, yhat = yhat, MSE = MSE, loadings = M1, 
      DFindex = Dindex)
}

Now that we have the function, let’s see if we can get it to work. First, we’ll need to compile all of our data

Let’s add a code which incorporates the previous values of the return.

#' Below is the modified diffusion index code to include lagged variables.
#'
#' @param y - response variable
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param m - number of diffusion indexes used
#' @param tau - VaR level to use; must be between 0 and 1
#' @param ar_tf - AR transformation type. (1 - no transformation,
#' 2 - absolute value, 3 - asymmetric slope)
#' @param p - number of AR lags to include. Default is one.
#' @param print_mdl - option to print the model summary to make sure everytning is ok. 0 is default.
#' @param model - model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
#'
#' @return - returns a list of variables for use in the diffusion index
#' @export
#'
#' @examples
mod_di_wl = function (y, x, orig, m, tau, ar_tf = 1, p = 1, print_mdl = 0, model = 1, end = NULL) 
{
  # Converts the response variables into a matrix
  if (!is.matrix(x)) 
      x = as.matrix(x)
  # nT is number of t time-steps
  nT = dim(x)[1]
  # Add a line to establish the number of data points used in the test.
  if (is.null(end) != TRUE){
    nT = end
  }
  # k is the number of diffusion indices used
  k = dim(x)[2]
  # Sanity checks to ensure that the origin isn't past the number of time points
  if (orig > nT) 
      orig = nT
  # Makes sure that there aren't more predictors than there variables in the dataset
  if (m > k) 
      m = k
  # Makes sure there are at least some variables
  if (m < 1) 
      m = 1
  # Subdivides the dataframe
  x1 = x[1:orig, ]
  # Calculates means of each row
  me = apply(x1, 2, mean)
  # Calculates standard deviations of each column
  se = sqrt(apply(x1, 2, var))
  # Creates a matrix x1, which normalizes all the columns. 
  # This may be an issue since it assumes that the distribution is sufficiently described by the first two moments
  x1 = x
  for (i in 1:k) {
      x1[, i] = (x1[, i] - me[i])/se[i]
  }
  V1 = cov(x1[1:orig, ])
  # Performs an eigen decomposition
  m1 = eigen(V1)
  # Selects eigenvalues
  sdev = m1$values
  # Selects eigenvectors
  M = m1$vectors
  # Makes a smaller matrix
  M1 = M[, 1:m]
  # This is the diffusion index model - [orig x p]*[p x m] = [orig x m]
  Dindex = x1 %*% M1
  # Cut down both the response and predictors to be a reasonable size
  y1 = y[1:orig]
  DF = Dindex[1:orig, ]
  # Copy the data frame
  DF_wl = Dindex
  # Lag the y-variable
  for (i in 1:p){
    # Create a lagged variable
    lag_var = lag(y, i)
    # Append the first lag to the data frame
    DF_wl = cbind(DF_wl,lag_var)
  }
  # Identify the right columns
  l_ar = ncol(DF_wl)
  f_ar = l_ar - p + 1
  # Keep the last columns kept to the side
  all_lag = DF_wl[,(f_ar:l_ar)]
  # Cut off the first row to avoid NA's
  DF_trim = DF_wl[1:orig,]
  # Rename the columns
  # Here's the new function with an untransformed AR(p) lag
  if (ar_tf == 1){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),])
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Assign the names
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
  }
  # Here's the new function with an SAV AR(p) lag
  if (ar_tf == 2){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),-(f_ar:l_ar)], abs(DF_trim[-(1:p),(f_ar:l_ar)]))
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Assign the names. Note that this is a matrix
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
  }
  # Here's the new function with an asymmetric slope for the AR(1) lag
  # Indicator; 0 if percent change is negative, 1 if it's positive
  # indi = ifelse(DF_trim[,ar] < 0, 0, 1)
  if (ar_tf == 3){
    # Create a matrix of indicators
    indi_mat = matrix(0, nrow(DF_wl), p)
    # Generalize the above code
    for (i in 1:p){
      # Populate the indicator
      indi_mat[,i] = ifelse(DF_wl[,f_ar + i - 1] < 0, 0, 1)
    }
  }
  # Fitting the regression
  if (ar_tf == 3){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),-(f_ar:l_ar)], DF_trim[-(1:p),(f_ar:l_ar)], indi_mat[((p+1):orig),])
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+2*p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Last are the positive indicator variables
    for (i in 1:p){
      nvec[i+1+m+p] = paste0("Pos_Val_for_Lag_", i)
    }
    # Assign the names. Note that this is a matrix
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
    # mm = rq(y1[-(1:p)] ~ DF_trim[-(1:p),-(f_ar:l_ar)] + DF_trim[-(1:p),(f_ar:l_ar)] + indi_mat[((p+1):orig),], tau = tau)
    # Add a different line to account for the indicator variable
    # intercept + m + 2*nlag to account for the number of indicator variables
    coef = matrix(mm$coefficients, (1 + m + 2*p), 1)
  }
  if (print_mdl == 1){
    print(summary(mm))
  }
  # Puts coefficients in a matrix - added the AR terms
  # coef = matrix(mm$coefficients, (m + 1), 1)
  if (ar_tf != 3){
    coef = matrix(mm$coefficients, (1 + m + p), 1)
  }
  # Initializes yhat variables and MSE
  yhat = NULL
  loss = NULL
  if (orig < nT) {
    # Creates a nfcst by (m+2) matrix
    # Add on the lagged variables
    newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, ], all_lag[(orig+1):nT,])
    # Incorporate lagged variables
    if (ar_tf == 3){
      newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, ], all_lag[(orig+1):nT,], indi_mat[(orig+1):nT,])
    }
    # [nfcstx(m+1)]*[(m+1)x1] = [nfcstx1]
    yhat = newx %*% coef
    # Calculates errors
    loss = abs(sum(ifelse(y[(orig + 1):nT] > yhat, tau, (-1)*(1-tau))))
    # Modifying this part to only print this if specified
    if (print_mdl == 1){
      cat("Losses of out-of-sample forecasts: ", loss, "\n")
    }
  }
  SWfore <- list(coef = coef, yhat = yhat, loss = loss, loadings = M1, 
      DFindex = Dindex, name_vector = nvec)
}

MV Caviar - Calcuating losses

# Decide on the optimal number of vectors.
# (y, x, orig, m, tau) 
#' Function that calculates loss over a given period of time for the diffusion index model
#'
#' @param y - response variables
#' @param x - explanatory variable
#' @param orig - forecast origin
#' @param end - forecasting ending. Note: as the function is currently written on 2/24, this option doesn't do anything.
#' @param m - number of diffusion indices to use
#' @param tau - VaR level
#' @param mod_di - use the modified DI?
#'
#' @return - returns a list of the loss sum and the loss vector
#' @export
#'
#' @examples - loss_calc(pc_df[,1], pc_df[,-1], 757, 1027, 1, 0.01)
loss_calc = function(y, x, orig, m, tau, mod_di = 0, ar_tf = 1, p = 1, print_mdl = 0, model = 1, end = NULL){
  # Extract y_hat values
  if (mod_di == 0){
    di = mod_di(y=y,x=x,orig=orig,m=m, tau=tau, end = end, print_mdl = print_mdl)
  }
  else {
    di = mod_di_wl(y=y,x=x,orig=orig,m=m, tau=tau, ar_tf = ar_tf, p = p, print_mdl = print_mdl, model = model, end = end)
  }
  # mod_di_wl = function (y, x, orig, m, tau, ar_tf = 1, p = 1, print_mdl = 0, model = 1)
  yhat = di$yhat[1:(end-orig)]
  # Calculate the loss
  # Initialize loss vector
  lvec = rep(0,(end-orig))
  # Take the difference
  for (i in 1:(end-orig)){
    # Calculate an indicator variable
    ind = ifelse(y[orig+i] < yhat[i], 1,0)
    # Use indicator in function below
    lvec[i] = (tau - ind)*(y[orig+i] - yhat[i])
  }
  # Add up the losses - change to look at sum of losses. Won't change decision criterion
  sumloss = sum(lvec)
  # sumloss = sum(lvec)/length(lvec)
  return(list(sumloss,lvec))
}

MV Caviar - Choosing the optimal number of predictors

#' Function that selects the optimal number of predictors
#'
#' @param y - response vector
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param end - ending of validation set
#' @param tau - VaR in question
#' @param low_m - low value of m to consider
#' @param high_m - high value of m to consider
#'
#' @return - returns the optimal value of m
#' @export
#'
#' @examples - opt_m(pc_df[,1], pc_df[,-1], 757, 1027, 0.01, low_m =1, high_m  = 5)
opt_m = function(y, x, orig, end = NULL, tau, low_m = 1, high_m, mod_di = 0, ar_tf = 1, p = 1, print_mdl = 0, model = 1, rowname = NULL){
  # Initialize a loss vector
  loss_vec = rep(0,high_m-low_m + 1)
  # Initialize an m vector
  m_vec = seq(low_m, high_m, by = 1)
  # Loop through and populate the loss vector
  for (i in 1:length(loss_vec)){
    loss_vec[i] = quiet(loss_calc(y=y,x=x,orig=orig,end=end, m = m_vec[i], tau = tau, mod_di = mod_di, ar_tf = ar_tf, p = p, print_mdl = print_mdl, model = model))[[1]]
  }
  # Find the minimizer
  opt_m = which.min(loss_vec)
  opt_p = NA
  # Combine into a data frame
  df = as.data.frame(cbind(opt_m, opt_p))
  names(df) <- c("Optimal m", "Optimal p")
  # Assign a rowname
  if (is.null(rowname) == TRUE){
    # Write the row names
    rownames(df) <- c("MV CAViaR")
  }
  else {
    rownames(df) <- rowname
  }
  # Return the loss_vector and the minimzer
  return(list(opt_m, loss_vec, df))
}
#' Function that selects the optimal number of lags
#'
#' @param y - response vector
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param end - ending of validation set
#' @param tau - VaR in question
#' @param low_m - low value of m to consider
#' @param high_m - high value of m to consider
#'
#' @return - returns the optimal value of m
#' @export
#'
#' @examples - opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = 757, end = 1007, tau = 0.01, low_m =1, high_m  = 5, low_p = 1, high_p = 10, ar_tf = 2, mod_di = 1)
opt_mp = function(y, x, orig, end = NULL, tau, low_m = 1, high_m, low_p = 1, high_p, mod_di = 0, ar_tf = 1, print_mdl = 0, model = 1, print_mp = 0, rowname = NULL){
  # Initialize a loss matrix
  loss_mat = matrix(0, high_p-low_p + 1,high_m-low_m + 1)
  # Initialize a p vector
  p_vec = seq(low_p, high_p, by = 1)
  # Loop through and populate the loss vector
  for (i in 1:nrow(loss_mat)){
    loss_mat[i,] = opt_m(y = y, x = x, orig = orig, end = end, tau = tau, low_m = low_m, high_m  = high_m, p = i, mod_di = mod_di, ar_tf = ar_tf, print_mdl = print_mdl, model = model)[[2]]
  }
  # Find the minimizer
  opt_p = which(loss_mat == min(loss_mat), arr.ind = TRUE)[1,1]
  opt_m = which(loss_mat == min(loss_mat), arr.ind = TRUE)[1,2]
  # Print the optimal p and optimal m
  df = as.data.frame(cbind(opt_m, opt_p))
  names(df) <- c("Optimal m", "Optimal p")
  # Assign a rowname
  if (is.null(rowname) == TRUE){
    if (ar_tf == 1){
      # Write the row names
      rownames(df) <- c("MV CAViaR + AR")
    } else if (ar_tf == 2){
      # Write the row names
      rownames(df) <- c("MV CAViaR + SAV")
    } else if (ar_tf == 3){
      # Write the row names
      rownames(df) <- c("MV CAViaR + AS")
    } else {
      rownames(df) <- c("Unknown Model")
    }
  }
  else {
    rownames(df) <- rowname
  }
  # Print the df if the option is turned on
  if (print_mp == 1){
    print(df)
  }
  # Return the loss_vector and the minimzer
  return(list(opt_m, opt_p, loss_mat, df))
}
#' A function that combines optimal values of m and p into a final table
#'
#' @param m1 - the data frame from the "MV CAViaR" run
#' @param m2 - the data frame from the "MV CAViaR + AR" run
#' @param m3 - the data frame from the "MV CAViaR + SAV" run
#' @param m4 - the data frame from the "MV CAViaR + AS" run
#'
#' @return - a nicely formatted table
#' @export
#'
#' @examples - pretty_pm(opt_pred_nl[[3]], opt_pm_m1[[4]], opt_pm_m2[[4]], opt_pm_m3[[4]])
pretty_pm = function(m1, m2, m3, m4){
  # Merge the individual data frames
  pm_pretty_df = rbind(m1, m2, m3, m4)
  # Format nicely
  pm_pretty_df %>% kable(caption = "Optimal Number of Diffusion Indices (m) and Lags (p) for Different Models", digits = 0) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = "The MV CAViaR model doesn't have an optimal value for p because there are no AR lags in the model"
  )
  
}

MV Caviar - Running the univariate model multiple times

#' Here is a function that runs the univariate CAViaR model 4 times
#'
#' @param df - the percent change data frame to consider
#' @param nfcst - number of forecasts to run
#' @param tau - the VaR level to consider
#' @param no_run - specifies if any models should not be run
#'
#' @return - a list of the 4 univariate model forecasts
#' @export
#'
#' @examples - aceg = gen_uv_test(pc_df, 1, 0.05, no_run = c(1,1,0,1))
gen_uv_test = function(df, nfcst, tau, no_run = c(0,0,0,0)){
  # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
  # Initialize a list  
  out_list = list()
  # Run the four models - model 1; SAV
  if (no_run[1] == 0){
    uvcav_1 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 1, G = 10, col = 1, level = tau)
  }
  # Add a filler if there's no entry
  else {
    uvcav_1 = 0
  }
  # Model 2 - AS
  if (no_run[2] == 0){
    uvcav_2 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 2, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_2 = 0
  }
  # Model 3 - GARCH
  if (no_run[3] == 0){
    uvcav_3 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 3, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_3 = 0
  }
  # Model 4 - Adaptive
  if (no_run[4] == 0){
    uvcav_4 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 4, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_4 = 0
  }
  # Export the data as a list
  return(list(uvcav_1, uvcav_2, uvcav_3, uvcav_4))
}

MV Caviar - Plotting function

#' Function to plot the data which we generate in previous functions
#'
#' @param plot_matrix - matrix with the data to plot
#' @param norm_value - what to subtact from the data to make it on a percentage change basis. Default is 100.
#'
#' @return 
#' @export - a plot of the data by diffusion index number
#'
#' @examples = plt_data(plot_mtx[[1]]), abc = plt_data(plot_mat, tau = 0.01)
plt_data = function(plot_matrix, tau, resp_var, ntest){
  # Establish a maximum and minimum value
  max_val = max(plot_matrix[,1:ncol(plot_matrix)])
  min_val = min(plot_matrix[,1:ncol(plot_matrix)])
  # Calculate inital and ending time value
  start = index(plot_matrix)[1]
  end = index(plot_matrix)[nrow(plot_matrix)]
  ind_vals = index(plot_matrix) - start
  # Create an initial plot and add lines
    for (i in 1:ncol(plot_matrix)){
      if (i == 1){
        # 4/2/2020 - fixing the index
        plot.ts(ind_vals,plot_matrix[,i], type = "l", xlab = paste("Days Since", as.Date(start)), ylab = "Percent Change in PG", ylim = c(min_val,max_val), lwd = 1, main = paste("Predicting", resp_var, "Returns from", as.Date(start), "to", as.Date(end)), sub = paste("The VaR Level is ", 100*tau, "%", "; There are ", ntest, " Trading Days Plotted Above", sep = ""))
        # plot.ts(index(plot_matrix), plot_matrix[,i], type = "l", xlab = "Trading Days", ylab = "Percent Change in PG", ylim = c(min_val,max_val), lwd = 1, main = "Predicting PG Returns Over Last 250 Trading Days in 2008", sub = paste("The VaR Level is ", 100*tau, "%", sep = ""))
    } else if(i %in% seq(2,8,1)) {
        lines(ind_vals,plot_matrix[,i], col = i-1, lty = 2)
    } else {
        lines(ind_vals,plot_matrix[,i], col = i-1, lty = 2, lwd = 2)
    }
    }
  # Define a sequence for plotting
  plot_seq = seq(1, ncol(plot_matrix))
  legend("topleft", legend = c(colnames(plot_matrix)), col = plot_seq, lty = c(1, rep(2, 7), rep(3, ifelse(ncol(plot_matrix)-8 <= 0, 0, ncol(plot_matrix)-8))), lwd = c(1, rep(1, 7), rep(2, ifelse(ncol(plot_matrix)-8 <= 0, 0, ncol(plot_matrix)-8))))
  # Add a line for 0
  # abline(h = 0, col = "black", lty = 2)
}

MV Caviar - Old Loss Test Function

#' A function to calculate losses based on the test sample
#'
#' @param true_vec - the true vector of returns
#' @param pred_vec - the predicted vector from the model runs
#' @param tau - VaR level. Must match what the model used
#'
#' @return - total losses and the entire loss vector
#' @export
#'
#' @examples
loss_test = function(true_vec, pred_vec, tau){
  # Initialize a loss vector
  lvec = rep(0, length(true_vec))
  # Initialize a break vector to see when VaR is broken
  bvec = rep(0, length(true_vec))
  for (i in 1:length(true_vec)){
    # Calculate an indicator variable
    bvec[i] = ifelse(true_vec[i] < pred_vec[i], 1,0)
    # Use indicator in function below
    lvec[i] = (tau - bvec[i])*(true_vec[i] - pred_vec[i])
  }
  # Add up the losses
  # sumloss = sum(lvec)/length(lvec)
  sumloss = sum(lvec)
  # Add up the VaR breakage
  varbreak = sum(bvec)/length(bvec)
  return(list(sumloss,lvec, varbreak, bvec))
}

MV Caviar - A generalized loss calculation function

#' A function to calculate losses based on the plot matrix
#'
#' @param data_mat - a matrix of forecasted VaR values, with the true value in the first column
#' @param tau - VaR level. Must match what the model used
#'
#' @return - a list of four items. 
#' 1 = a vector of the losses of all models. 
#' 2 = a vector showing the percentage of VaR breaks by model
#' 3 = the loss matrix
#' 4 = the break matrix
#' @export
#'
#' @examples
gen_loss_test = function(data_mat, tau){
  # Initialize loss and break matrices
  lmat = bmat = matrix(0, nrow = nrow(data_mat), ncol = ncol(data_mat)-1)
  # bvec = rep(0, length(true_vec))
  # Populate the matrices
  for (i in 1:nrow(lmat)){
    for (j in 1:(ncol(lmat))){
      # Calculate an indicator variable
      bmat[i,j] = ifelse(data_mat[i,1] < data_mat[i,j+1], 1,0)
      # Use indicator in function below
      lmat[i,j] = (tau - bmat[i,j])*(data_mat[i,1] - data_mat[i,j+1])
    }    
  }
  # Add up the losses
  sumloss = colSums(lmat)
  # Add up the VaR breakage
  varbreak = colSums(bmat)/nrow(bmat)
  return(list(sumloss, varbreak, lmat, bmat))
}

MV Caviar - Tables function

#' A function to make a nice comparison of losses
#'
#' @param data_mat - input data matrix used in the calculation of losses
#' @param loss_list - a list of the losses calculated from the CAViaR function
#' @param tau - the risk level used
#' @param ntest - the number of test points
#'
#' @return
#' @export - returns a nicely formatted table
#'
#' @examples - pretty_tables(plot_mat, l_list, tau = 0.01)
pretty_tables = function(data_mat, loss_list, tau, ntest){
  # Combine into a data frame
  df = as.data.frame(rbind(loss_list[[1]], loss_list[[2]]))
  # Calculate inital and ending time value
  start = index(data_mat)[1]
  end = index(data_mat)[nrow(data_mat)]
  # Add row/column names
  colnames(df) <- colnames(data_mat[,-1])
  rownames(df) <- c("Losses", "VaR Breaks (%)")
  # Convert to a table
  df %>% kable(caption = paste("Comparison of VaR Methods for a ", tau*100, "% VaR", sep = ""), digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", ntest, "trading days from", as.Date(start), "to", as.Date(end)))
}

Export function

#' A dressed up version of the export function
#'
#' @param var_file - file to export
#' @param path - filepath
#' @param filename - name of the file, ending with .CSV
#'
#' @return
#' @export - exported CSV file
#'
#' @examples - exp_func(var_file = var_1pc_2016_usetf[[1]], path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "TEST.csv")
exp_func = function(var_file, path, filename){
  # Write a zoo
  write.zoo(var_file, paste0(path, filename), quote = FALSE, sep = ",")
}
# exp_func(var_file = var_1pc_2016_usetf[[1]], path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "TEST.csv")

Big Simulation Function

#' This is the "master" function where we'll evaluate the importance of the VaR model over several time periods
#'
#' @param symbol_list - a list of symbols to feed into the model 
#' @param resp_var - the response variable
#' @param compl_case - should the model require complete cases? Default value is 1.
#' @param adj_close - use adjusted close price for the predictors? Default value is 1.
#' @param resp_adj_close - use adjusted close price for the response? Default value is 1.
#' @param start_date - start date to pull data from
#' @param end_date - end date to pull data from
#' @param nval - number of validation points to use
#' @param ntest - number of test points to use
#' @param tau - VaR level to use
#' @param low_m - low number of predictors to test
#' @param high_m  - low number of predictors to test
#' @param uv_list - a list of a pre-run univariate model. If a data frame is not provided, the lengthy uv model will run 
#' @param no_run - things not to run in the model
#' @param low_p - low value for number of lags
#' @param high_p - high value for number of lags
#' @param na_interp - should the function interpolate NA's
#' @param print_mdl - print the model summaries?
#' @param print_mp - print the optimal values for p and m
#' @param lag_pred - do you want to lag the m predictors (default is 1; strongly recommended)
#' @param rowname - what to name the rows of the nice p and m matrix
#' @param export_csv - do you want to export a CSV? Default is 1.
#' @param path - path to export the CSV
#' @param filename - what to name the CSV
#'
#' @return - a list of the plot matrix, a plot, a list with losses, and a table
#' @export - a plot and a table
#'
#' @examples - cav_simul(c("DIS", "GE", "IBM", "MMM", "XOM"), resp_var = "PG", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 5, tau = 0.01, uv_list = uv_cav_list)
cav_simul = function(symbol_list, resp_var, compl_case = 1, adj_close = 1, resp_adj_close = 1, start_date = "1900-01-01", end_date = Sys.Date(), nval, ntest, tau, low_m = 1, high_m, low_p = 1, high_p, uv_list = NULL, no_run = c(0,0,0,0), na_interp = TRUE, print_mdl = 0, print_mp = 0, lag_pred = 1, rowname = NULL, export_csv = 1, path, filename){
  # Select data parameters, pull the data, and percent change the data
  df = diff_index_df(symbol_list = symbol_list, resp_var = resp_var, compl_case = compl_case, adj_close = adj_close, resp_adj_close = resp_adj_close, start_date = start_date, end_date = end_date, lag_pred = lag_pred)
  # Take the percent change of the data
  pc_df = pc_diff_index(df)
  # Extract the legnth of the data frame
  nr = test_end = nrow(pc_df)
  # Calculate the start of the val period, the end of the val period, and the beginning and end of test period
  test_orig = test_end - ntest
  val_end = test_orig
  val_orig = test_orig - nval
  # Test for the optimal number of parameters
  opt_pred_nl = opt_m(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, rowname = rowname)
  opt_pred_art1 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p,mod_di = 1, ar_tf = 1, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  opt_pred_art2 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p,mod_di = 1, ar_tf = 2, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  opt_pred_art3 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p, mod_di = 1, ar_tf = 3, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  # gen_uv_test(pc_df, 1, 0.05, no_run = c(1,1,0,1))
  # Use the above forecasts to input into the above
  mv_fcst = mod_di(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_nl[[1]], tau = tau, print_mdl = print_mdl)
  mv_fcst_art1 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art1[[1]], p = opt_pred_art1[[2]], tau = tau, ar_tf = 1, print_mdl = print_mdl)
  mv_fcst_art2 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art2[[1]], p = opt_pred_art2[[2]], tau = tau, ar_tf = 2, print_mdl = print_mdl)
  mv_fcst_art3 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art3[[1]], p = opt_pred_art3[[2]], tau = tau, ar_tf = 3, print_mdl = print_mdl)
  # Calculate the number of predictions
  if (is.null(uv_list) == TRUE){
    # Print a warning
    print("WARNING: Not supplying an input data frame will require this function to run for a significant amount of time (1hr+)")
    # Call the function
    # gen_uv_test = function(df, nfcst, tau, no_run = c(0,0,0,0)){
    # print(head(pc_df))
    uv_list = gen_uv_test(df = pc_df, nfcst = ntest, tau = tau, no_run = no_run)
    # Add to a data frame
    # Incorporate the rolling predictions function results here
  plot_mat = cbind(pc_df[(test_orig+1):nrow(pc_df),1], mv_fcst$yhat[1:ntest], mv_fcst_art1$yhat[1:ntest], mv_fcst_art2$yhat[1:ntest], mv_fcst_art3$yhat[1:ntest], uv_list[[1]][(test_orig+1):test_end]*(-1), uv_list[[2]][(test_orig+1):test_end]*(-1), uv_list[[3]][(test_orig+1):test_end]*(-1), uv_list[[4]][(test_orig+1):test_end]*(-1))
  } else {
    # Assign the columns of the data frame
    # head(var_5pc_2010_usetf[[1]][,6:9])
    # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
    # test_df = head(var_5pc_2010_usetf[[1]][,6:9])
    # test_df$SAV
    # test_df$`Abs. Slope`
    # test_df$`Ind. GARCH`
    # test_df$Adaptive
    plot_mat = cbind(pc_df[(test_orig+1):nrow(pc_df),1], mv_fcst$yhat[1:ntest], mv_fcst_art1$yhat[1:ntest], mv_fcst_art2$yhat[1:ntest], mv_fcst_art3$yhat[1:ntest], uv_list$SAV, uv_list$`Abs. Slope`, uv_list$`Ind. GARCH`, uv_list$Adaptive)
  }
  # Count the NAs and print a warning
  print(paste("NOTE: There are ", sum(is.na(plot_mat)), " NA(s) in the dataset", sep = ""))
  # Linearly interpolate the NAs
  if (na_interp == TRUE){
    # Assign the plot matrix to a new value
    plot_mat_na <- plot_mat
    # Print a warning
    print("WARNING: There were missing values in the plot matrix.")
    # Interpolate the NA's
    for (i in 1:ncol(plot_mat_na)){
      # Interpolate the data
      plot_mat[,i] <- na.approx(plot_mat_na[,i])
    }
  }
  # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE)
  # Add descriptive titles onto the plot_mat
  colnames(plot_mat) <- c(resp_var, "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")
  # colnames(plot_mat) <- c("SPY", "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")
  # Plot everything
  plot = plt_data(plot_mat, tau = tau, resp_var = resp_var, ntest = ntest)
  # Calculate losses
  l_list = gen_loss_test(plot_mat, tau = tau)
  # Put into tables
  tables = pretty_tables(plot_mat, l_list, tau = tau, ntest = ntest)
  # Run the function for optimal p and m
  pm_table = pretty_pm(opt_pred_nl[[3]], opt_pred_art1[[4]], opt_pred_art2[[4]], opt_pred_art3[[4]])
  # Export the matrix
  if (export_csv == 1){
    exp_func(var_file = plot_mat, path, filename)
  }
  # Print the tables and the plot
  print(plot)
  print(tables)
  print(pm_table)
  return(list(plot_mat, plot, l_list, tables, plot_mat_na, pm_table))
}

Sector ETFs as Explanatory Variables

Here’s what I’m thinking.

Lowest level: 1%, 5%, 10% VaR Next, 2008, 2010, 2014, or 2016 Highest - ETF choices 3 x 4 x 5 = 60 runs

# Import the data from CSV's
# abc = read.csv("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", sep = ",", header = T)
# head(abc)
# as.xts(abc, order.by = abc[,1])
# test1 <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", sep = ",",  index.column =0, header = T)
# dat_zoo <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", index.column=0, sep=",", header = T, format="%m/%d/%Y")
# dat_zoo <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", index.column=0, sep=",", header = T, FUN=as.yearmon)
# test1
# dat_xts = as.xts(dat_zoo, order.by = dat_zoo[,1])

Importing and Running Datasets

# Mess around code - it works!
abc = read.csv("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_us_etf.csv", sep = ",", header = T, stringsAsFactors = FALSE)
abc$Index = as.Date(abc$Index)
# abc$index_t = as.POSIXct(abc$Index, format = "%Y-%m-%d")
# index_t
# head(abc)
abc_x = xts(abc[,-1], order.by = abc[,1])
# head(abc_x)
#' A function to input the VaR files, plot them and generate tables
#'
#' @param file_path - file path to use
#' @param filename - name of the file
#' @param tau - quantile to use
#' @param resp_var - response variable to use in the plot
#' @param ntest - number of test points
#' @param cn_input - column name inputs
#'
#' @return - a list of the xts file, the plot, the loss list, and tables
#' @export - a plot and tables
#'
#' @examples - test = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)
var_input_disp = function(file_path, filename, tau, resp_var = "SPY", ntest = 250, cn_input = c("SPY", "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8")){
# var_input_disp = function(file_path, filename, tau, resp_var = "SPY", ntest = 250, cn_input = c("SPY", "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")){
  # Import data
  plot_mat = read.csv(paste0(file_path,filename), sep = ",", header = T, stringsAsFactors = FALSE)
  # Fix date format
  plot_mat$Index = as.Date(plot_mat$Index)
  # Convert to an xts
  plot_mat = xts(plot_mat[,-1], order.by = plot_mat[,1])
  # Fix column names
  colnames(plot_mat) <- cn_input
  # Plot everything
  plot = plt_data(plot_mat, tau = tau, resp_var = resp_var, ntest = ntest)
  # Calculate losses
  l_list = gen_loss_test(plot_mat, tau = tau)
  # Put into tables
  tables = pretty_tables(plot_mat, l_list, tau = tau, ntest = ntest)
  # Print the tables and the plot
  print(plot)
  print(tables)
  # print(pm_table)
  # Return the xts, the plot, the loss list, and the tables
  return(list(plot_mat, plot, l_list, tables))
}
# test = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)

Problem Solving on 4.29.2020

# Create a fake data frame, and assign silly numbers
df_FAKE = as.data.frame(cbind(1,2,3,4))
rownames(df_FAKE) <- c("Numbers")
colnames(df_FAKE) <- c("One", "Two", "Three", "Four")
df_FAKE %>% kable(caption = "Fake Data", digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", 4, "fake data points"))

Fake Data
One Two Three Four
Numbers 1 2 3 4
Note:
Calculated using 4 fake data points

# df %>% kable(caption = paste("Comparison of VaR Methods for a ", tau*100, "% VaR", sep = ""), digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", ntest, "trading days from", as.Date(start), "to", as.Date(end)))

2008 Ending

U.S. ETFs

# return(list(plot_mat, plot, l_list, tables))
# Call the above function
v1_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2622245

$rect$left
[1] -14.44

$rect$top
[1] 0.1472487


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.12102625  0.09480380  0.06858136  0.04235891  0.01613646 -0.01008599
[7] -0.03630844 -0.06253089 -0.08875334

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.046 1.1 1.371 1.265 0.208 0.213 0.219 0.355
VaR Breaks (%) 0.200 0.2 0.212 0.208 0.028 0.028 0.028 0.060
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

pretty_tables(v1_2008_usetf[[1]], v1_2008_usetf[[3]], tau = 0.01, ntest = 250)

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.046 1.1 1.371 1.265 0.208 0.213 0.219 0.355
VaR Breaks (%) 0.200 0.2 0.212 0.208 0.028 0.028 0.028 0.060
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v5_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2008_us_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2331775

$rect$left
[1] -14.44

$rect$top
[1] 0.1459559


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.122638104  0.099320355  0.076002605  0.052684855  0.029367105
[6]  0.006049355 -0.017268395 -0.040586145 -0.063903895

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.319 1.344 1.768 1.385 0.651 0.654 0.640 0.956
VaR Breaks (%) 0.260 0.236 0.340 0.260 0.076 0.076 0.064 0.160
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v10_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2008_us_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2149814

$rect$left
[1] -14.44

$rect$top
[1] 0.145146


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.123647828  0.102149692  0.080651555  0.059153418  0.037655282
[6]  0.016157145 -0.005340992 -0.026839129 -0.048337265

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.623 1.564 1.738 1.534 1.077 1.066 1.068 1.366
VaR Breaks (%) 0.328 0.312 0.348 0.332 0.144 0.156 0.140 0.224
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

# head(v10_2008_usetf[[1]])
v10_2008_usetf
[[1]]
                     SPY           M1            M2            M3           M4
2008-01-04 -0.0248118342 -0.009008995 -0.0114038250 -6.506809e-03 -0.009785113
2008-01-07 -0.0008496457 -0.010368632 -0.0084263336 -2.036757e-03 -0.012744013
2008-01-08 -0.0162801552 -0.008802236 -0.0086991683 -2.789016e-03 -0.007451870
2008-01-09  0.0104552682 -0.010007454 -0.0116292656 -3.989046e-03 -0.014165540
2008-01-10  0.0065326791 -0.008237012 -0.0120536801 -6.577309e-03 -0.008756820
2008-01-11 -0.0081012617 -0.008609990 -0.0129927437 -9.762320e-03 -0.010171014
2008-01-14  0.0080307055 -0.009693916 -0.0103604940 -7.036558e-03 -0.008039063
2008-01-15 -0.0222590643 -0.008431257 -0.0107313252 -8.410308e-03 -0.009426473
2008-01-16 -0.0086497429 -0.010423230 -0.0110791278 -3.437999e-03 -0.010803258
2008-01-17 -0.0262580047 -0.009571017 -0.0132299493 -4.863722e-04 -0.009079987
2008-01-18 -0.0103207892 -0.010797726 -0.0190338918  5.987178e-04 -0.015159761
2008-01-22 -0.0101983469 -0.009605623 -0.0155451810 -1.908073e-03 -0.010131788
2008-01-23  0.0237370019 -0.009639679 -0.0163684113 -2.596526e-03 -0.013168828
2008-01-24  0.0084061146 -0.007409178 -0.0100474056 -1.010362e-02 -0.008638127
2008-01-25 -0.0145510127 -0.008840543 -0.0091431102 -1.341522e-02 -0.011004540
2008-01-28  0.0164012399 -0.009938185 -0.0081656547 -6.081848e-03 -0.006816994
2008-01-29  0.0049417741 -0.007968071 -0.0092892564 -8.738580e-03 -0.008070188
2008-01-30 -0.0073848272 -0.008596855 -0.0110532525 -1.079707e-02 -0.010106749
2008-01-31  0.0180699420 -0.009524466 -0.0111233920 -6.712125e-03 -0.006772641
2008-02-01  0.0159598414 -0.007756630 -0.0152328258 -8.498832e-03 -0.008319582
2008-02-04 -0.0126893053 -0.007936975 -0.0085145294 -1.405719e-02 -0.008129413
2008-02-05 -0.0271387661 -0.009637700 -0.0042830575 -7.857168e-03 -0.007084066
2008-02-06 -0.0080845276 -0.010811106 -0.0068349665  7.617532e-04 -0.011078908
2008-02-07  0.0065919871 -0.009410725 -0.0120956639 -1.257335e-03 -0.010130019
2008-02-08 -0.0064417940 -0.008615910 -0.0130952735 -7.442815e-03 -0.013198425
2008-02-11  0.0050966925 -0.009368441 -0.0088169211 -8.079318e-03 -0.008651630
2008-02-12  0.0092287560 -0.008610177 -0.0109754180 -7.887713e-03 -0.009837578
2008-02-13  0.0101709979 -0.008206896 -0.0072899663 -9.499480e-03 -0.007667360
2008-02-14 -0.0088387495 -0.008662643 -0.0034199380 -1.133014e-02 -0.008718016
2008-02-15 -0.0002217737 -0.009865055 -0.0076506907 -7.386325e-03 -0.008853091
2008-02-19  0.0028078397 -0.008752311 -0.0125648537 -5.889297e-03 -0.007606921
2008-02-20  0.0029473150 -0.008657089 -0.0133507941 -8.341232e-03 -0.011259223
2008-02-21 -0.0083486448 -0.008957609 -0.0103648493 -9.189042e-03 -0.008675011
2008-02-22  0.0061388665 -0.009812979 -0.0104726336 -5.365208e-03 -0.009118869
2008-02-25  0.0125298205 -0.008249017 -0.0091615346 -7.087356e-03 -0.009119955
2008-02-26  0.0074727484 -0.008427043 -0.0075540555 -1.159413e-02 -0.008898289
2008-02-27 -0.0010126331 -0.008564273 -0.0050563357 -1.122542e-02 -0.008244339
2008-02-28 -0.0098152362 -0.009300350 -0.0077330765 -7.676311e-03 -0.007159259
2008-02-29 -0.0225356856 -0.009715207 -0.0102540059 -6.336050e-03 -0.010606640
2008-03-03 -0.0023943356 -0.010715271 -0.0111511634 -9.231015e-04 -0.012602247
2008-03-04 -0.0038274278 -0.008661862 -0.0104759316 -3.681841e-03 -0.008118783
2008-03-05  0.0062962527 -0.009268762 -0.0131507287 -5.814803e-03 -0.012469017
2008-03-06 -0.0209151448 -0.008661525 -0.0123276509 -8.934318e-03 -0.010592554
2008-03-07 -0.0103537085 -0.010299790 -0.0086824929 -4.105654e-03 -0.009922167
2008-03-10 -0.0132709532 -0.009772380 -0.0094145094 -1.133176e-03 -0.009855150
2008-03-11  0.0353069013 -0.010005542 -0.0120210470 -3.596715e-03 -0.013439784
2008-03-12 -0.0093956541 -0.006829697 -0.0127647007 -1.320668e-02 -0.007568566
2008-03-13  0.0022053488 -0.009469711 -0.0110452077 -1.015872e-02 -0.010840656
2008-03-14 -0.0156173232 -0.008764945 -0.0117671308 -6.925152e-03 -0.006525839
2008-03-17 -0.0101584795 -0.010165074 -0.0106106051 -4.986029e-03 -0.010365173
2008-03-18  0.0407036536 -0.009689853 -0.0100672542 -2.156171e-03 -0.010372163
2008-03-19 -0.0250818491 -0.006388991 -0.0115073692 -1.344860e-02 -0.007394236
2008-03-20  0.0183532925 -0.010703682 -0.0130045908 -6.288316e-03 -0.013397510
2008-03-24  0.0197907260 -0.007990610 -0.0115022698 -6.146751e-03 -0.003903936
2008-03-25  0.0009646820 -0.007668727 -0.0071201631 -1.364887e-02 -0.009708333
2008-03-26 -0.0123112882 -0.008810584  0.0023141238 -1.092103e-02 -0.007429743
2008-03-27 -0.0031585591 -0.009770029 -0.0096555770 -6.661349e-03 -0.006549194
2008-03-28 -0.0096105193 -0.009253123 -0.0122075248 -4.873192e-03 -0.009866858
2008-03-31  0.0034917825 -0.009585075 -0.0118099038 -4.965288e-03 -0.011753099
2008-04-01  0.0345554764 -0.008756104 -0.0103472125 -6.900763e-03 -0.010462100
2008-04-02  0.0006585635 -0.007054069 -0.0065405357 -1.469148e-02 -0.006322901
2008-04-03  0.0024843280 -0.008789507 -0.0067383411 -1.330204e-02 -0.009872383
2008-04-04 -0.0010953896 -0.008983872 -0.0016709888 -8.258529e-03 -0.005174838
2008-04-07  0.0005112351 -0.008900336 -0.0037977186 -7.449499e-03 -0.007051658
2008-04-08 -0.0010226662 -0.009014350 -0.0081290029 -7.418208e-03 -0.011513767
2008-04-09 -0.0072621323 -0.009069519 -0.0119318420 -8.003548e-03 -0.006990304
2008-04-10  0.0013979696 -0.009679355 -0.0131530340 -6.495937e-03 -0.011522222
2008-04-11 -0.0195997100 -0.008818423 -0.0106663172 -5.822471e-03 -0.010361064
2008-04-14 -0.0033793720 -0.010182540 -0.0069344720 -4.095752e-03 -0.009812502
2008-04-15  0.0023291752 -0.009286144 -0.0066675930 -4.648167e-03 -0.009524887
2008-04-16  0.0267334733 -0.008735598 -0.0112287777 -7.427651e-03 -0.012586346
2008-04-17  0.0014600779 -0.007466123 -0.0094122855 -1.407224e-02 -0.006202972
2008-04-18  0.0103804298 -0.009032809 -0.0073928352 -1.171313e-02 -0.010433456
2008-04-21  0.0005051632 -0.008196470 -0.0059049694 -9.395215e-03 -0.004292174
2008-04-22 -0.0044122300 -0.009124997 -0.0075596071 -9.329673e-03 -0.009906278
2008-04-23 -0.0015963935 -0.009654872 -0.0097764786 -7.384091e-03 -0.007902490
2008-04-24  0.0043473397 -0.009034157 -0.0108286996 -5.648843e-03 -0.009764405
2008-04-25  0.0092113415 -0.008645427 -0.0134112793 -6.253240e-03 -0.010745012
2008-04-28  0.0002150994 -0.008467068 -0.0089681018 -1.039274e-02 -0.007867665
2008-04-29 -0.0039467796 -0.008933061 -0.0056142597 -8.173139e-03 -0.008876406
2008-04-30 -0.0059136301 -0.009396057 -0.0045445344 -5.854553e-03 -0.007250070
2008-05-01  0.0204743354 -0.009647983 -0.0093389533 -6.869330e-03 -0.011413316
2008-05-02  0.0027600366 -0.007635783 -0.0073064619 -8.041400e-03 -0.008557196
2008-05-05 -0.0048171655 -0.008737952 -0.0076116895 -1.193308e-02 -0.009561398
2008-05-06  0.0086260700 -0.009273423 -0.0086225189 -7.468741e-03 -0.005587270
2008-05-07 -0.0179713227 -0.008601222 -0.0093840212 -8.949787e-03 -0.010625991
2008-05-08 -0.0025837062 -0.010129929 -0.0065284720 -4.985588e-03 -0.009857324
2008-05-09 -0.0018699025 -0.008931359 -0.0082239227 -4.761851e-03 -0.007696242
2008-05-12  0.0111686003 -0.009284553 -0.0134015989 -6.824563e-03 -0.012118641
2008-05-13  0.0001424174 -0.008144653 -0.0099090503 -8.522933e-03 -0.009474034
2008-05-14  0.0020618202 -0.009043985 -0.0084488040 -9.835671e-03 -0.009355268
2008-05-15  0.0124255030 -0.008714788 -0.0046449225 -6.969332e-03 -0.007054251
2008-05-16  0.0009117828 -0.008468629 -0.0085913564 -1.027173e-02 -0.008504347
2008-05-19  0.0027300754 -0.008876867 -0.0069908722 -1.075360e-02 -0.009192716
2008-05-20 -0.0081422442 -0.008751969 -0.0076908499 -8.065270e-03 -0.007113497
2008-05-21 -0.0170593399 -0.009664896 -0.0129163904 -7.651344e-03 -0.008884352
2008-05-22  0.0001434719 -0.010191092 -0.0108505800 -2.939370e-03 -0.011730527
2008-05-23 -0.0134949236 -0.008834264 -0.0109120649 -3.780096e-03 -0.010653744
2008-05-27  0.0073832283 -0.009829299 -0.0101715399 -4.262240e-03 -0.010282362
2008-05-28  0.0046050538 -0.008655302 -0.0119377833 -6.275858e-03 -0.010561451
2008-05-29  0.0050126405 -0.008729524 -0.0093534639 -1.022954e-02 -0.009905164
2008-05-30  0.0024965093 -0.008469196 -0.0050385378 -7.269173e-03 -0.007195174
2008-06-02 -0.0103845953 -0.009028096 -0.0085846550 -8.877645e-03 -0.009105794
2008-06-03 -0.0058486286 -0.009674288 -0.0090114624 -6.303002e-03 -0.008237972
2008-06-04 -0.0005071990 -0.009108791 -0.0113517204 -3.282676e-03 -0.009120079
2008-06-05  0.0197999656 -0.009038541 -0.0140747752 -6.088543e-03 -0.010380395
2008-06-06 -0.0324135219 -0.007921051 -0.0114746838 -1.266514e-02 -0.009906518
2008-06-09  0.0024184013 -0.011258927 -0.0114033270 -4.660554e-03 -0.012337918
2008-06-10 -0.0049897990 -0.008768479 -0.0097804247 -4.280059e-03 -0.007209819
2008-06-11 -0.0148216573 -0.009287020 -0.0100541328 -5.866447e-03 -0.011190394
2008-06-12  0.0038006245 -0.010017039 -0.0095581533 -4.632764e-03 -0.011559032
                     M5           M6          M7          M8
2008-01-04 -0.010686294 -0.013024402 -0.01106787 -0.01002831
2008-01-07 -0.013228876 -0.015812464 -0.01337510 -0.01009095
2008-01-08 -0.012261209 -0.015326785 -0.01281398 -0.01011362
2008-01-09 -0.013124694 -0.017075181 -0.01328459 -0.01037225
2008-01-10 -0.013242877 -0.015986706 -0.01313312 -0.01033621
2008-01-11 -0.012909533 -0.015305373 -0.01274700 -0.01003977
2008-01-14 -0.012787766 -0.015566701 -0.01247925 -0.01003002
2008-01-15 -0.012671248 -0.014813285 -0.01222984 -0.01002333
2008-01-16 -0.014159012 -0.017416000 -0.01370327 -0.01033608
2008-01-17 -0.013963194 -0.017824470 -0.01341766 -0.01029021
2008-01-18 -0.015882524 -0.020399415 -0.01581681 -0.01049074
2008-01-22 -0.015742488 -0.020891064 -0.01534156 -0.01050162
2008-01-23 -0.015603659 -0.021346177 -0.01508860 -0.01052314
2008-01-24 -0.016862082 -0.019755462 -0.01614248 -0.01052334
2008-01-25 -0.016446659 -0.018817161 -0.01549864 -0.01048218
2008-01-28 -0.016688862 -0.019830912 -0.01551913 -0.01086290
2008-01-29 -0.016659563 -0.018466167 -0.01562666 -0.01087487
2008-01-30 -0.015914871 -0.017531569 -0.01490531 -0.01087535
2008-01-31 -0.015467599 -0.017740087 -0.01446217 -0.01084328
2008-02-01 -0.016061234 -0.016506717 -0.01491178 -0.01086248
2008-02-04 -0.016447785 -0.015447268 -0.01509242 -0.01053754
2008-02-05 -0.016433787 -0.016184237 -0.01497007 -0.01075964
2008-02-06 -0.018386887 -0.019267574 -0.01729184 -0.01088540
2008-02-07 -0.017777008 -0.019521060 -0.01661554 -0.01086917
2008-02-08 -0.017107892 -0.018660927 -0.01609005 -0.01088838
2008-02-11 -0.016271395 -0.018678827 -0.01564079 -0.01053919
2008-02-12 -0.015521003 -0.017964212 -0.01510702 -0.01050788
2008-02-13 -0.015309504 -0.016976154 -0.01481249 -0.01052990
2008-02-14 -0.015189963 -0.016101563 -0.01438782 -0.01050928
2008-02-15 -0.014863200 -0.016581009 -0.01365206 -0.01043245
2008-02-19 -0.013850842 -0.015870568 -0.01310742 -0.01042488
2008-02-20 -0.013174020 -0.015211847 -0.01272853 -0.01030622
2008-02-21 -0.012572280 -0.014788114 -0.01226457 -0.01035170
2008-02-22 -0.012533072 -0.015092339 -0.01204527 -0.01035296
2008-02-25 -0.012338920 -0.014073229 -0.01172091 -0.01033177
2008-02-26 -0.012553822 -0.013206034 -0.01187468 -0.01029768
2008-02-27 -0.012387555 -0.012569861 -0.01166039 -0.01033426
2008-02-28 -0.011563377 -0.012209050 -0.01124187 -0.01029673
2008-02-29 -0.011578654 -0.012929035 -0.01118355 -0.01029744
2008-03-03 -0.013532766 -0.015487476 -0.01323495 -0.01030203
2008-03-04 -0.012883603 -0.015135024 -0.01263646 -0.01031471
2008-03-05 -0.012393577 -0.015009980 -0.01222917 -0.01033507
2008-03-06 -0.012188990 -0.014381744 -0.01176701 -0.01033025
2008-03-07 -0.013505074 -0.016389464 -0.01360403 -0.01035688
2008-03-10 -0.013499995 -0.016842926 -0.01334929 -0.01039458
2008-03-11 -0.013914770 -0.017662398 -0.01339084 -0.01062285
2008-03-12 -0.016112226 -0.016026370 -0.01632837 -0.01094729
2008-03-13 -0.015925810 -0.016692753 -0.01600873 -0.01090959
2008-03-14 -0.015038615 -0.015915603 -0.01549607 -0.01082506
2008-03-17 -0.015527647 -0.016990939 -0.01574294 -0.01124373
2008-03-18 -0.015435997 -0.017565805 -0.01544405 -0.01122777
2008-03-19 -0.018002278 -0.015977974 -0.01875981 -0.01106906
2008-03-20 -0.019140476 -0.018224565 -0.01981496 -0.01167267
2008-03-24 -0.019455168 -0.017238085 -0.01981922 -0.01138780
2008-03-25 -0.019897626 -0.016245206 -0.01994828 -0.01138054
2008-03-26 -0.018593554 -0.015636550 -0.01916683 -0.01138651
2008-03-27 -0.018452294 -0.016355351 -0.01881581 -0.01171685
2008-03-28 -0.017527668 -0.016131034 -0.01816089 -0.01173378
2008-03-31 -0.017234291 -0.016584202 -0.01773119 -0.01171185
2008-04-01 -0.016432530 -0.015958550 -0.01712933 -0.01169614
2008-04-02 -0.018388134 -0.014550503 -0.01932527 -0.01172888
2008-04-03 -0.017250829 -0.014061347 -0.01862664 -0.01171184
2008-04-04 -0.016243034 -0.013571593 -0.01790164 -0.01169237
2008-04-07 -0.015190037 -0.013253338 -0.01728016 -0.01172288
2008-04-08 -0.014217090 -0.012521856 -0.01668403 -0.01141414
2008-04-09 -0.013348262 -0.012269086 -0.01565399 -0.01141968
2008-04-10 -0.012815686 -0.012687296 -0.01520254 -0.01143884
2008-04-11 -0.012091436 -0.012281908 -0.01408391 -0.01140905
2008-04-14 -0.013736268 -0.014432368 -0.01597748 -0.01177099
2008-04-15 -0.013194505 -0.014278900 -0.01522415 -0.01179067
2008-04-16 -0.012603576 -0.013725831 -0.01471571 -0.01174159
2008-04-17 -0.014175774 -0.012662022 -0.01619105 -0.01177454
2008-04-18 -0.013305582 -0.012238908 -0.01563512 -0.01175754
2008-04-21 -0.013326750 -0.011350304 -0.01538101 -0.01175619
2008-04-22 -0.012530893 -0.011029920 -0.01481623 -0.01174428
2008-04-23 -0.012151335 -0.011208449 -0.01439205 -0.01178524
2008-04-24 -0.011493195 -0.011082639 -0.01352539 -0.01159925
2008-04-25 -0.010918111 -0.010679179 -0.01245636 -0.01160130
2008-04-28 -0.011103574 -0.010157694 -0.01226322 -0.01161636
2008-04-29 -0.010417474 -0.009899896 -0.01179293 -0.01191309
2008-04-30 -0.010147353 -0.010065905 -0.01125705 -0.01189862
2008-05-01 -0.010088066 -0.010444978 -0.01088915 -0.01188514
2008-05-02 -0.011191943 -0.009679979 -0.01226603 -0.01192531
2008-05-05 -0.010673187 -0.009381876 -0.01179814 -0.01185793
2008-05-06 -0.010434391 -0.009531474 -0.01142907 -0.01188692
2008-05-07 -0.010619777 -0.009070932 -0.01130841 -0.01167423
2008-05-08 -0.011898293 -0.010978453 -0.01237490 -0.01225096
2008-05-09 -0.011370878 -0.010955332 -0.01192697 -0.01238535
2008-05-12 -0.010825458 -0.010850475 -0.01149399 -0.01205054
2008-05-13 -0.011185751 -0.010299525 -0.01157246 -0.01204441
2008-05-14 -0.010446242 -0.010023421 -0.01113051 -0.01203207
2008-05-15 -0.009822970 -0.009716711 -0.01069132 -0.01202071
2008-05-16 -0.010463808 -0.009197119 -0.01090922 -0.01205900
2008-05-19 -0.009807669 -0.008960367 -0.01049814 -0.01202546
2008-05-20 -0.009441795 -0.008691880 -0.01015312 -0.01205942
2008-05-21 -0.009677833 -0.009343417 -0.01011826 -0.01202825
2008-05-22 -0.010917471 -0.011026874 -0.01125025 -0.01244069
2008-05-23 -0.010244604 -0.010709778 -0.01082146 -0.01241750
2008-05-27 -0.010930029 -0.011876182 -0.01174083 -0.01259578
2008-05-28 -0.010945754 -0.011354743 -0.01157793 -0.01253764
2008-05-29 -0.010696934 -0.010927395 -0.01130220 -0.01252711
2008-05-30 -0.010477758 -0.010512823 -0.01105546 -0.01251679
2008-06-02 -0.010067573 -0.010172302 -0.01075565 -0.01250593
2008-06-03 -0.010536006 -0.011076615 -0.01058750 -0.01253083
2008-06-04 -0.010448435 -0.011418657 -0.01034156 -0.01255308
2008-06-05 -0.009867967 -0.011151951 -0.01001228 -0.01252008
2008-06-06 -0.011123198 -0.010357913 -0.01140092 -0.01248867
2008-06-09 -0.013388159 -0.013617947 -0.01466262 -0.01271641
2008-06-10 -0.012800199 -0.013151571 -0.01417605 -0.01281886
2008-06-11 -0.012478084 -0.013289827 -0.01372488 -0.01279919
2008-06-12 -0.013022082 -0.014746910 -0.01402494 -0.01308495
 [ reached getOption("max.print") -- omitted 139 rows ]

[[2]]
[[2]]$rect
[[2]]$rect$w
[1] 78.97413

[[2]]$rect$h
[1] 0.2149814

[[2]]$rect$left
[1] -14.44

[[2]]$rect$top
[1] 0.145146


[[2]]$text
[[2]]$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

[[2]]$text$y
[1]  0.123647828  0.102149692  0.080651555  0.059153418  0.037655282
[6]  0.016157145 -0.005340992 -0.026839129 -0.048337265



[[3]]
[[3]][[1]]
[1] 1.622597 1.564253 1.737877 1.534359 1.076953 1.066265 1.068465 1.366382

[[3]][[2]]
[1] 0.328 0.312 0.348 0.332 0.144 0.156 0.140 0.224

[[3]][[3]]
               [,1]         [,2]         [,3]         [,4]         [,5]
  [1,] 1.422256e-02 1.206721e-02 1.647452e-02 1.352405e-02 1.271299e-02
  [2,] 9.518986e-04 7.576688e-04 1.187111e-04 1.189437e-03 1.237923e-03
  [3,] 6.730127e-03 6.822888e-03 1.214203e-02 7.945456e-03 3.617051e-03
  [4,] 2.046272e-03 2.208453e-03 1.444431e-03 2.462081e-03 2.357996e-03
  [5,] 1.476969e-03 1.858636e-03 1.310999e-03 1.528950e-03 1.977556e-03
  [6,] 5.087287e-05 4.891482e-04 1.661058e-04 2.069752e-04 4.808271e-04
  [7,] 1.772462e-03 1.839120e-03 1.506726e-03 1.606977e-03 2.081847e-03
  [8,] 1.244503e-02 1.037497e-02 1.246388e-02 1.154933e-02 8.629034e-03
  [9,] 1.773487e-04 2.429385e-04 4.690570e-03 2.153515e-04 5.509269e-04
 [10,] 1.501829e-02 1.172525e-02 2.319447e-02 1.546022e-02 1.106533e-02
 [11,] 4.769366e-05 8.713103e-04 9.827556e-03 4.838972e-04 5.561735e-04
 [12,] 5.334513e-04 5.346834e-04 7.461246e-03 5.990296e-05 5.544141e-04
 [13,] 3.337668e-03 4.010541e-03 2.633353e-03 3.690583e-03 3.934066e-03
 [14,] 1.581529e-03 1.845352e-03 1.850973e-03 1.704424e-03 2.526820e-03
 [15,] 5.139423e-03 4.867112e-03 1.022214e-03 3.191825e-03 1.895646e-04
 [16,] 2.633942e-03 2.456689e-03 2.248309e-03 2.321823e-03 3.309010e-03
 [17,] 1.290984e-03 1.423103e-03 1.368035e-03 1.301196e-03 2.160134e-03
 [18,] 1.212028e-04 3.668425e-04 3.412246e-04 2.721922e-04 8.530044e-04
 [19,] 2.759441e-03 2.919333e-03 2.478207e-03 2.484258e-03 3.353754e-03
 [20,] 2.371647e-03 3.119267e-03 2.445867e-03 2.427942e-03 3.202108e-03
 [21,] 4.277098e-03 3.757298e-03 1.367883e-04 4.103903e-03 3.758480e-04
 [22,] 1.575096e-02 2.057014e-02 1.735344e-02 1.804923e-02 9.634481e-03
 [23,] 2.726578e-04 1.124605e-03 7.961653e-03 2.994381e-04 1.030236e-03
 [24,] 1.600271e-03 1.868765e-03 7.849322e-04 1.672201e-03 2.436900e-03
 [25,] 2.174116e-04 6.653480e-04 1.001021e-04 6.756631e-04 1.066610e-03
 [26,] 1.446513e-03 1.391361e-03 1.317601e-03 1.374832e-03 2.136809e-03
 [27,] 1.783893e-03 2.020417e-03 1.711647e-03 1.906633e-03 2.474976e-03
 [28,] 1.837789e-03 1.746096e-03 1.967048e-03 1.783836e-03 2.548050e-03
 [29,] 1.584954e-04 4.876930e-03 2.491388e-04 1.086598e-04 6.351213e-04
 [30,] 9.643281e-04 7.428917e-04 7.164551e-04 8.631318e-04 1.464143e-03
 [31,] 1.156015e-03 1.537269e-03 8.697136e-04 1.041476e-03 1.665868e-03
 [32,] 1.160440e-03 1.629811e-03 1.128855e-03 1.420654e-03 1.612134e-03
 [33,] 6.089642e-05 2.016204e-04 8.403974e-05 3.263664e-05 4.223635e-04
 [34,] 1.595185e-03 1.661150e-03 1.150407e-03 1.525774e-03 1.867194e-03
 [35,] 2.077884e-03 2.169136e-03 1.961718e-03 2.164978e-03 2.486874e-03
 [36,] 1.589979e-03 1.502680e-03 1.906688e-03 1.637104e-03 2.002657e-03
 [37,] 7.551639e-04 4.043703e-04 1.021279e-03 7.231706e-04 1.137492e-03
 [38,] 4.633974e-04 1.873944e-03 1.925033e-03 2.390379e-03 1.748141e-04
 [39,] 1.153843e-02 1.105351e-02 1.457967e-02 1.073614e-02 9.861329e-03
 [40,] 8.320935e-04 8.756828e-04 1.324111e-03 1.020791e-03 1.113843e-03
 [41,] 4.834434e-04 6.648504e-04 1.310281e-04 4.291356e-04 9.056175e-04
 [42,] 1.556501e-03 1.944698e-03 1.211106e-03 1.876527e-03 1.868983e-03
 [43,] 1.102826e-02 7.728745e-03 1.078274e-02 9.290332e-03 7.853539e-03
 [44,] 4.852639e-05 1.504094e-03 5.623249e-03 3.883874e-04 3.151365e-04
 [45,] 3.148716e-03 3.470799e-03 1.092400e-02 3.074223e-03 2.290415e-05
 [46,] 4.531244e-03 4.732795e-03 3.890362e-03 4.874669e-03 4.922167e-03
 [47,] 2.309362e-03 3.369047e-04 3.811024e-04 1.644380e-03 6.716572e-04
 [48,] 1.167506e-03 1.325056e-03 1.236407e-03 1.304600e-03 1.813116e-03
 [49,] 6.167140e-03 3.465173e-03 7.822954e-03 8.182336e-03 5.208378e-04
 [50,] 6.594226e-07 4.521256e-05 4.655205e-03 2.066937e-05 5.369167e-04
 [51,] 5.039351e-03 5.077091e-03 4.285982e-03 5.107582e-03 5.613965e-03
 [52,] 1.682357e-02 1.221703e-02 1.046992e-02 1.591885e-02 6.371614e-03
 [53,] 2.905697e-03 3.135788e-03 2.464161e-03 3.175080e-03 3.749377e-03
 [54,] 2.778134e-03 3.129300e-03 2.593748e-03 2.369466e-03 3.924589e-03
 [55,] 8.633409e-04 8.084845e-04 1.461355e-03 1.067301e-03 2.086231e-03
 [56,] 3.150634e-03 1.316287e-02 1.251237e-03 4.393391e-03 6.282266e-04
 [57,] 6.611470e-04 6.497018e-04 3.502790e-04 3.390635e-04 1.529374e-03
 [58,] 3.216570e-04 2.597006e-04 4.263595e-03 2.563388e-05 7.917149e-04
 [59,] 1.307686e-03 1.530169e-03 8.457070e-04 1.524488e-03 2.072607e-03
 [60,] 4.331158e-03 4.490269e-03 4.145624e-03 4.501758e-03 5.098801e-03
 [61,] 7.712633e-04 7.199099e-04 1.535005e-03 6.981465e-04 1.904670e-03
 [62,] 1.127384e-03 9.222669e-04 1.578637e-03 1.235671e-03 1.973516e-03
 [63,] 7.888482e-04 5.755992e-05 7.163140e-04 4.079448e-04 1.514764e-03
 [64,] 9.411571e-04 4.308954e-04 7.960734e-04 7.562893e-04 1.570127e-03
 [65,] 7.991684e-04 7.106337e-04 6.395542e-04 1.049110e-03 1.319442e-03
 [66,] 1.807387e-04 4.669710e-04 7.414160e-05 2.446457e-04 6.086129e-04
 [67,] 1.107732e-03 1.455100e-03 7.893906e-04 1.292019e-03 1.421366e-03
 [68,] 9.703159e-03 8.040053e-03 1.239952e-02 8.314782e-03 6.757447e-03
 [69,] 6.803168e-04 3.555100e-04 7.163797e-05 6.433130e-04 1.035690e-03
 [70,] 1.161532e-03 8.996768e-04 6.977342e-04 1.185406e-03 1.552368e-03
 [71,] 3.546907e-03 3.796225e-03 3.416112e-03 3.931982e-03 3.933705e-03
 [72,] 8.926201e-04 1.087236e-03 1.553232e-03 7.663050e-04 1.563585e-03
 [73,] 1.941324e-03 1.777327e-03 2.209356e-03 2.081389e-03 2.368601e-03
 [74,] 8.701633e-04 6.410133e-04 9.900378e-04 4.797338e-04 1.383191e-03
 [75,] 4.712767e-04 3.147377e-04 4.917443e-04 5.494048e-04 8.118663e-04
 [76,] 8.058479e-04 8.180085e-04 5.787697e-04 6.306096e-04 1.055494e-03
 [77,] 1.338150e-03 1.517604e-03 9.996183e-04 1.411174e-03 1.584053e-03
 [78,] 1.785677e-03 2.262262e-03 1.546458e-03 1.995635e-03 2.012945e-03
 [79,] 8.682167e-04 9.183201e-04 1.060784e-03 8.082765e-04 1.131867e-03
 [80,] 4.986281e-04 1.667480e-04 4.226360e-04 4.929626e-04 6.470694e-04
 [81,] 3.482426e-04 1.232186e-03 5.316952e-05 1.336440e-04 4.233723e-04
 [82,] 3.012232e-03 2.981329e-03 2.734367e-03 3.188765e-03 3.056240e-03
 [83,] 1.039582e-03 1.006650e-03 1.080144e-03 1.131723e-03 1.395198e-03
 [84,] 3.920786e-04 2.794524e-04 7.115911e-04 4.744233e-04 5.856022e-04
 [85,] 1.789949e-03 1.724859e-03 1.609481e-03 1.421334e-03 1.906046e-03
 [86,] 8.433091e-03 7.728571e-03 8.119382e-03 6.610798e-03 6.616391e-03
 [87,] 7.546223e-04 3.944766e-04 2.401882e-04 7.273618e-04 9.314586e-04
 [88,] 7.061457e-04 6.354020e-04 2.891949e-04 5.826340e-04 9.500976e-04
 [89,] 2.045315e-03 2.457020e-03 1.799316e-03 2.328724e-03 2.199406e-03
 [90,] 8.287071e-04 1.005147e-03 8.665350e-04 9.616452e-04 1.132817e-03
 [91,] 1.110580e-03 1.051062e-03 1.189749e-03 1.141709e-03 1.250806e-03
 [92,] 2.114029e-03 1.707043e-03 1.939483e-03 1.947975e-03 2.224847e-03
 [93,] 9.380412e-04 9.503139e-04 1.118352e-03 9.416130e-04 1.137559e-03
 [94,] 1.160694e-03 9.720948e-04 1.348367e-03 1.192279e-03 1.253774e-03
 [95,] 6.097247e-05 4.062549e-04 6.927650e-05 9.258728e-04 1.299551e-04
 [96,] 6.654999e-03 3.728655e-03 8.467196e-03 7.357490e-03 6.643356e-03
 [97,] 1.033456e-03 1.099405e-03 3.082842e-04 1.187400e-03 1.106094e-03
 [98,] 4.194594e-03 2.324573e-03 8.743345e-03 2.557061e-03 2.925288e-03
 [99,] 1.721253e-03 1.755477e-03 1.164547e-03 1.766559e-03 1.831326e-03
[100,] 1.326036e-03 1.654284e-03 1.088091e-03 1.516650e-03 1.555081e-03
[101,] 1.374216e-03 1.436610e-03 1.524218e-03 1.491780e-03 1.570957e-03
[102,] 1.096570e-03 7.535047e-04 9.765683e-04 9.691683e-04 1.297427e-03
[103,] 1.220849e-03 1.619946e-03 1.356255e-03 1.150922e-03 2.853203e-04
[104,] 3.825659e-04 3.162834e-04 4.543732e-05 2.389344e-04 4.687378e-04
[105,] 8.601592e-04 1.084452e-03 2.775477e-04 8.612880e-04 9.941236e-04
[106,] 2.883851e-03 3.387474e-03 2.588851e-03 3.018036e-03 2.966793e-03
[107,] 2.204322e-02 1.884495e-02 1.777354e-02 2.025630e-02 1.916129e-02
[108,] 1.367733e-03 1.382173e-03 7.078955e-04 1.475632e-03 1.580656e-03
[109,] 3.778680e-04 4.790626e-04 6.387656e-04 2.220020e-04 7.810400e-04
[110,] 4.981174e-03 4.290772e-03 8.059689e-03 3.268137e-03 2.109216e-03
[111,] 1.381766e-03 1.335878e-03 8.433389e-04 1.535966e-03 1.682271e-03
[112,] 2.129560e-03 2.626822e-03 1.740260e-03 2.292046e-03 2.514556e-03
[113,] 8.727046e-04 1.325271e-03 1.098960e-03 9.235203e-04 1.351117e-03
[114,] 4.232733e-04 3.271333e-04 4.847639e-04 4.777784e-04 7.359074e-04
[115,] 4.312778e-04 1.641003e-03 2.000022e-03 2.943925e-03 2.143142e-04
[116,] 1.108537e-03 1.106739e-03 6.952493e-04 1.282465e-03 1.332476e-03
[117,] 6.891622e-03 2.163036e-03 1.040966e-02 5.433185e-03 4.397124e-03
[118,] 9.169415e-04 1.085311e-03 3.790024e-04 9.293947e-04 1.126240e-03
[119,] 7.196621e-04 1.290030e-03 4.679479e-04 7.570790e-04 9.649833e-04
[120,] 1.390176e-03 1.851333e-03 1.033402e-03 1.640902e-03 1.585653e-03
[121,] 1.708709e-02 1.799876e-02 1.830646e-02 1.573981e-02 1.494943e-02
[122,] 5.201258e-04 2.740029e-04 2.252491e-03 4.807410e-04 7.206142e-04
[123,] 1.325117e-03 1.827109e-03 6.577993e-04 1.346900e-03 1.593163e-03
[124,] 1.185726e-03 1.649975e-03 1.097513e-03 1.664032e-03 1.511388e-03
[125,] 7.239923e-03 3.309565e-03 7.340965e-03 6.340025e-03 5.139029e-03
               [,6]         [,7]         [,8]
  [1,] 1.060869e-02 1.236957e-02 1.330517e-02
  [2,] 1.496282e-03 1.252545e-03 9.241308e-04
  [3,] 8.580334e-04 3.119558e-03 5.549885e-03
  [4,] 2.753045e-03 2.373986e-03 2.082752e-03
  [5,] 2.251939e-03 1.966580e-03 1.686889e-03
  [6,] 7.204112e-04 4.645743e-04 1.938510e-04
  [7,] 2.359741e-03 2.050995e-03 1.806072e-03
  [8,] 6.701202e-03 9.026306e-03 1.101216e-02
  [9,] 8.766257e-04 5.053526e-04 1.686337e-04
 [10,] 7.590182e-03 1.155631e-02 1.437101e-02
 [11,] 1.007863e-03 5.496024e-04 1.699515e-05
 [12,] 1.069272e-03 5.143210e-04 3.032722e-05
 [13,] 4.508318e-03 3.882560e-03 3.426014e-03
 [14,] 2.816158e-03 2.454859e-03 1.892946e-03
 [15,] 4.266148e-04 9.476237e-05 3.661952e-03
 [16,] 3.623215e-03 3.192037e-03 2.726414e-03
 [17,] 2.340794e-03 2.056843e-03 1.581664e-03
 [18,] 1.014674e-03 7.520482e-04 3.490528e-04
 [19,] 3.581003e-03 3.253211e-03 2.891322e-03
 [20,] 3.246656e-03 3.087162e-03 2.682233e-03
 [21,] 2.757963e-04 2.403114e-04 1.936590e-03
 [22,] 9.859076e-03 1.095182e-02 1.474121e-02
 [23,] 1.118305e-03 9.207310e-04 2.800873e-04
 [24,] 2.611305e-03 2.320753e-03 1.746116e-03
 [25,] 1.221913e-03 9.648253e-04 4.446588e-04
 [26,] 2.377552e-03 2.073749e-03 1.563588e-03
 [27,] 2.719297e-03 2.433577e-03 1.973663e-03
 [28,] 2.714715e-03 2.498349e-03 2.070090e-03
 [29,] 7.262813e-04 5.549073e-04 1.670533e-04
 [30,] 1.635924e-03 1.343029e-03 1.021068e-03
 [31,] 1.867841e-03 1.591526e-03 1.323272e-03
 [32,] 1.815916e-03 1.567584e-03 1.325353e-03
 [33,] 6.439469e-04 3.915925e-04 2.003058e-04
 [34,] 2.123121e-03 1.818414e-03 1.649183e-03
 [35,] 2.660305e-03 2.425073e-03 2.286159e-03
 [36,] 2.067878e-03 1.934742e-03 1.777043e-03
 [37,] 1.155723e-03 1.064776e-03 9.321627e-04
 [38,] 2.393813e-04 1.426638e-04 4.814934e-05
 [39,] 8.645986e-03 1.021692e-02 1.101442e-02
 [40,] 1.309314e-03 1.084062e-03 7.907699e-04
 [41,] 1.130760e-03 8.809033e-04 6.487280e-04
 [42,] 2.130623e-03 1.852542e-03 1.663132e-03
 [43,] 5.880061e-03 8.233318e-03 9.526407e-03
 [44,] 6.035755e-04 3.250321e-04 3.167414e-07
 [45,] 3.571973e-04 7.833460e-06 2.588737e-03
 [46,] 5.296930e-03 4.869774e-03 4.592975e-03
 [47,] 6.630716e-04 6.932716e-04 1.551633e-04
 [48,] 1.889810e-03 1.821408e-03 1.311494e-03
 [49,] 2.982802e-05 1.091257e-04 4.313033e-03
 [50,] 6.832459e-04 5.584464e-04 1.085251e-04
 [51,] 5.826946e-03 5.614771e-03 5.193143e-03
 [52,] 8.193487e-03 5.689839e-03 1.261151e-02
 [53,] 3.657786e-03 3.816825e-03 3.002597e-03
 [54,] 3.702881e-03 3.960995e-03 3.117853e-03
 [55,] 1.720989e-03 2.091296e-03 1.234522e-03
 [56,] 3.325262e-04 6.855545e-04 8.322982e-04
 [57,] 1.319679e-03 1.565725e-03 8.558286e-04
 [58,] 6.520515e-04 8.550372e-04 2.123262e-04
 [59,] 2.007598e-03 2.122298e-03 1.520364e-03
 [60,] 5.051403e-03 5.168480e-03 4.625162e-03
 [61,] 1.520907e-03 1.998383e-03 1.238744e-03
 [62,] 1.654568e-03 2.111097e-03 1.419616e-03
 [63,] 1.247620e-03 1.680625e-03 1.059698e-03
 [64,] 1.376457e-03 1.779140e-03 1.223411e-03
 [65,] 1.149919e-03 1.566137e-03 1.039147e-03
 [66,] 5.006954e-04 8.391861e-04 4.157548e-04
 [67,] 1.408527e-03 1.660051e-03 1.283681e-03
 [68,] 6.586022e-03 4.964217e-03 7.371590e-03
 [69,] 1.105300e-03 1.259811e-03 8.391615e-04
 [70,] 1.660807e-03 1.755332e-03 1.411984e-03
 [71,] 4.045930e-03 4.144918e-03 3.847506e-03
 [72,] 1.412210e-03 1.765113e-03 1.323462e-03
 [73,] 2.261934e-03 2.601555e-03 2.213797e-03
 [74,] 1.185547e-03 1.588617e-03 1.226135e-03
 [75,] 6.617690e-04 1.040400e-03 7.332054e-04
 [76,] 9.612055e-04 1.279566e-03 1.018884e-03
 [77,] 1.542998e-03 1.787273e-03 1.594659e-03
 [78,] 1.989052e-03 2.166770e-03 2.081264e-03
 [79,] 1.037279e-03 1.247832e-03 1.183146e-03
 [80,] 5.953116e-04 7.846151e-04 7.966314e-04
 [81,] 4.152275e-04 5.343421e-04 5.984987e-04
 [82,] 3.091931e-03 3.136349e-03 3.235948e-03
 [83,] 1.244002e-03 1.502607e-03 1.468535e-03
 [84,] 4.564710e-04 6.980973e-04 7.040763e-04
 [85,] 1.815754e-03 2.005514e-03 2.051299e-03
 [86,] 8.010351e-03 5.996621e-03 5.667387e-03
 [87,] 8.394747e-04 9.791197e-04 9.667250e-04
 [88,] 9.085429e-04 1.005707e-03 1.051545e-03
 [89,] 2.201908e-03 2.266259e-03 2.321915e-03
 [90,] 1.044194e-03 1.171488e-03 1.218683e-03
 [91,] 1.208524e-03 1.319233e-03 1.409389e-03
 [92,] 2.214221e-03 2.311683e-03 2.444621e-03
 [93,] 1.010890e-03 1.182100e-03 1.297078e-03
 [94,] 1.169044e-03 1.322822e-03 1.475554e-03
 [95,] 5.496359e-05 2.010871e-04 3.917178e-04
 [96,] 6.944330e-03 6.246971e-03 4.527985e-03
 [97,] 1.117035e-03 1.139373e-03 1.258416e-03
 [98,] 2.506631e-03 2.406115e-03 9.696801e-04
 [99,] 1.925941e-03 1.912406e-03 1.997900e-03
[100,] 1.595980e-03 1.618298e-03 1.714269e-03
[101,] 1.594004e-03 1.631484e-03 1.753975e-03
[102,] 1.300933e-03 1.355197e-03 1.501330e-03
[103,] 1.910636e-04 3.710527e-05 2.121330e-04
[104,] 5.227986e-04 4.738873e-04 6.682205e-04
[105,] 1.091146e-03 9.834365e-04 1.204588e-03
[106,] 3.095192e-03 2.981225e-03 3.232005e-03
[107,] 1.985005e-02 1.891135e-02 1.793237e-02
[108,] 1.603635e-03 1.708102e-03 1.513481e-03
[109,] 8.161772e-04 9.186252e-04 7.829057e-04
[110,] 1.378647e-03 9.871001e-04 1.820220e-03
[111,] 1.854753e-03 1.782556e-03 1.688558e-03
[112,] 2.660780e-03 2.611763e-03 2.569397e-03
[113,] 1.384450e-03 1.418297e-03 1.371423e-03
[114,] 7.940022e-04 8.313185e-04 8.240732e-04
[115,] 3.151443e-04 3.027506e-04 3.328124e-04
[116,] 1.490568e-03 1.387423e-03 1.434252e-03
[117,] 2.898848e-03 3.777014e-03 3.114976e-03
[118,] 1.386751e-03 1.191339e-03 1.218848e-03
[119,] 1.253055e-03 1.044694e-03 1.117001e-03
[120,] 1.900566e-03 1.675937e-03 1.788361e-03
[121,] 1.249194e-02 1.421015e-02 1.295306e-02
[122,] 1.114478e-03 8.434098e-04 7.756687e-04
[123,] 2.020407e-03 1.709736e-03 1.678176e-03
[124,] 1.923180e-03 1.632721e-03 1.638802e-03
[125,] 1.606886e-03 3.995103e-03 3.622468e-03
 [ reached getOption("max.print") -- omitted 125 rows ]

[[3]][[4]]
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
  [1,]    1    1    1    1    1    1    1    1
  [2,]    0    0    0    0    0    0    0    0
  [3,]    1    1    1    1    1    1    1    1
  [4,]    0    0    0    0    0    0    0    0
  [5,]    0    0    0    0    0    0    0    0
  [6,]    0    0    0    0    0    0    0    0
  [7,]    0    0    0    0    0    0    0    0
  [8,]    1    1    1    1    1    1    1    1
  [9,]    0    0    1    0    0    0    0    0
 [10,]    1    1    1    1    1    1    1    1
 [11,]    0    0    1    0    0    0    0    0
 [12,]    1    0    1    1    0    0    0    0
 [13,]    0    0    0    0    0    0    0    0
 [14,]    0    0    0    0    0    0    0    0
 [15,]    1    1    1    1    0    0    0    1
 [16,]    0    0    0    0    0    0    0    0
 [17,]    0    0    0    0    0    0    0    0
 [18,]    0    0    0    0    0    0    0    0
 [19,]    0    0    0    0    0    0    0    0
 [20,]    0    0    0    0    0    0    0    0
 [21,]    1    1    0    1    0    0    0    1
 [22,]    1    1    1    1    1    1    1    1
 [23,]    0    1    1    0    0    0    0    0
 [24,]    0    0    0    0    0    0    0    0
 [25,]    0    0    0    0    0    0    0    0
 [26,]    0    0    0    0    0    0    0    0
 [27,]    0    0    0    0    0    0    0    0
 [28,]    0    0    0    0    0    0    0    0
 [29,]    1    1    0    1    0    0    0    0
 [30,]    0    0    0    0    0    0    0    0
 [31,]    0    0    0    0    0    0    0    0
 [32,]    0    0    0    0    0    0    0    0
 [33,]    0    0    0    0    0    0    0    0
 [34,]    0    0    0    0    0    0    0    0
 [35,]    0    0    0    0    0    0    0    0
 [36,]    0    0    0    0    0    0    0    0
 [37,]    0    0    0    0    0    0    0    0
 [38,]    1    1    1    1    0    0    0    0
 [39,]    1    1    1    1    1    1    1    1
 [40,]    0    0    1    0    0    0    0    0
 [41,]    0    0    1    0    0    0    0    0
 [42,]    0    0    0    0    0    0    0    0
 [43,]    1    1    1    1    1    1    1    1
 [44,]    1    1    1    1    0    0    0    0
 [45,]    1    1    1    1    0    0    0    1
 [46,]    0    0    0    0    0    0    0    0
 [47,]    1    0    0    1    0    0    0    0
 [48,]    0    0    0    0    0    0    0    0
 [49,]    1    1    1    1    1    0    1    1
 [50,]    0    0    1    0    0    0    0    0
 [51,]    0    0    0    0    0    0    0    0
 [52,]    1    1    1    1    1    1    1    1
 [53,]    0    0    0    0    0    0    0    0
 [54,]    0    0    0    0    0    0    0    0
 [55,]    0    0    0    0    0    0    0    0
 [56,]    1    1    1    1    0    0    0    1
 [57,]    0    0    0    0    0    0    0    0
 [58,]    1    0    1    0    0    0    0    0
 [59,]    0    0    0    0    0    0    0    0
 [60,]    0    0    0    0    0    0    0    0
 [61,]    0    0    0    0    0    0    0    0
 [62,]    0    0    0    0    0    0    0    0
 [63,]    0    0    0    0    0    0    0    0
 [64,]    0    0    0    0    0    0    0    0
 [65,]    0    0    0    0    0    0    0    0
 [66,]    0    0    0    1    0    0    0    0
 [67,]    0    0    0    0    0    0    0    0
 [68,]    1    1    1    1    1    1    1    1
 [69,]    0    0    0    0    0    0    0    0
 [70,]    0    0    0    0    0    0    0    0
 [71,]    0    0    0    0    0    0    0    0
 [72,]    0    0    0    0    0    0    0    0
 [73,]    0    0    0    0    0    0    0    0
 [74,]    0    0    0    0    0    0    0    0
 [75,]    0    0    0    0    0    0    0    0
 [76,]    0    0    0    0    0    0    0    0
 [77,]    0    0    0    0    0    0    0    0
 [78,]    0    0    0    0    0    0    0    0
 [79,]    0    0    0    0    0    0    0    0
 [80,]    0    0    0    0    0    0    0    0
 [81,]    0    1    1    0    0    0    0    0
 [82,]    0    0    0    0    0    0    0    0
 [83,]    0    0    0    0    0    0    0    0
 [84,]    0    0    0    0    0    0    0    0
 [85,]    0    0    0    0    0    0    0    0
 [86,]    1    1    1    1    1    1    1    1
 [87,]    0    0    0    0    0    0    0    0
 [88,]    0    0    0    0    0    0    0    0
 [89,]    0    0    0    0    0    0    0    0
 [90,]    0    0    0    0    0    0    0    0
 [91,]    0    0    0    0    0    0    0    0
 [92,]    0    0    0    0    0    0    0    0
 [93,]    0    0    0    0    0    0    0    0
 [94,]    0    0    0    0    0    0    0    0
 [95,]    0    1    1    1    0    0    0    0
 [96,]    1    1    1    1    1    1    1    1
 [97,]    0    0    0    0    0    0    0    0
 [98,]    1    1    1    1    1    1    1    1
 [99,]    0    0    0    0    0    0    0    0
[100,]    0    0    0    0    0    0    0    0
[101,]    0    0    0    0    0    0    0    0
[102,]    0    0    0    0    0    0    0    0
[103,]    1    1    1    1    1    1    0    0
[104,]    0    0    0    0    0    0    0    0
[105,]    0    0    0    0    0    0    0    0
[106,]    0    0    0    0    0    0    0    0
[107,]    1    1    1    1    1    1    1    1
[108,]    0    0    0    0    0    0    0    0
[109,]    0    0    1    0    0    0    0    0
[110,]    1    1    1    1    1    1    1    1
[111,]    0    0    0    0    0    0    0    0
[112,]    0    0    0    0    0    0    0    0
[113,]    0    0    0    0    0    0    0    0
[114,]    0    0    0    0    0    0    0    0
[115,]    1    1    1    1    0    0    0    0
[116,]    0    0    0    0    0    0    0    0
[117,]    1    1    1    1    1    1    1    1
[118,]    0    0    0    0    0    0    0    0
[119,]    0    0    0    0    0    0    0    0
[120,]    0    0    0    0    0    0    0    0
[121,]    1    1    1    1    1    1    1    1
[122,]    0    0    1    0    0    0    0    0
[123,]    0    0    0    0    0    0    0    0
[124,]    0    0    0    0    0    0    0    0
[125,]    1    1    1    1    1    1    1    1
 [ reached getOption("max.print") -- omitted 125 rows ]


[[4]]

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.623 1.564 1.738 1.534 1.077 1.066 1.068 1.366
VaR Breaks (%) 0.328 0.312 0.348 0.332 0.144 0.156 0.140 0.224
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

NA
# 1%, 5%, 10% VaR - 2008 - 1st set of predictors
# var_1pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2008_us_etf.csv", uv_list = var_1pc_2008_usetf[[1]])
# var_5pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2008_us_etf.csv", uv_list = var_5pc_2008_usetf[[1]])
# var_10pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2008_us_etf.csv", uv_list = var_10pc_2008_usetf[[1]])

Global ETFs

# Call the above function
v1_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2008_glob_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2622245

$rect$left
[1] -14.44

$rect$top
[1] 0.1472487


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.12102625  0.09480380  0.06858136  0.04235891  0.01613646 -0.01008599
[7] -0.03630844 -0.06253089 -0.08875334

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.740 0.761 0.841 0.867 0.208 0.213 0.219 0.355
VaR Breaks (%) 0.108 0.112 0.120 0.108 0.028 0.028 0.028 0.060
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v5_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2008_glob_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2448994

$rect$left
[1] -14.44

$rect$top
[1] 0.1464776


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.121987643  0.097497701  0.073007760  0.048517819  0.024027878
[6] -0.000462063 -0.024952004 -0.049441945 -0.073931886

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.160 1.173 2.157 1.283 0.651 0.654 0.640 0.956
VaR Breaks (%) 0.176 0.172 0.412 0.184 0.076 0.076 0.064 0.160
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v10_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2008_glob_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2149814

$rect$left
[1] -14.44

$rect$top
[1] 0.145146


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.123647828  0.102149692  0.080651555  0.059153418  0.037655282
[6]  0.016157145 -0.005340992 -0.026839129 -0.048337265

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.517 1.517 1.791 1.523 1.077 1.066 1.068 1.366
VaR Breaks (%) 0.284 0.284 0.348 0.288 0.144 0.156 0.140 0.224
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

# 1%, 5%, 10% VaR - 2008 - 2nd set of predictors
# var_1pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2008_glob_etf.csv", uv_list = var_1pc_2008_usetf[[1]])
# var_5pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2008_glob_etf.csv", uv_list = var_5pc_2008_usetf[[1]])
# var_10pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2008_glob_etf.csv", uv_list = var_10pc_2008_usetf[[1]])

Commodity ETFs

# 1%, 5%, 10% VaR - 2008 - 3rd set of predictors
# var_1pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2008_comm_etf.csv", uv_list = var_1pc_2008_usetf[[1]])
# var_5pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2008_comm_etf.csv", uv_list = var_5pc_2008_usetf[[1]])
# var_10pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2008_comm_etf.csv", uv_list = var_10pc_2008_usetf[[1]])

Bond ETFs

# Call the above function
v1_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2008_bond_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2622245

$rect$left
[1] -14.44

$rect$top
[1] 0.1472487


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.12102625  0.09480380  0.06858136  0.04235891  0.01613646 -0.01008599
[7] -0.03630844 -0.06253089 -0.08875334

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.891 1.017 1.271 1.090 0.208 0.213 0.219 0.355
VaR Breaks (%) 0.156 0.168 0.224 0.128 0.028 0.028 0.028 0.060
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v5_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2008_bond_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2331775

$rect$left
[1] -14.44

$rect$top
[1] 0.1459559


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.122638104  0.099320355  0.076002605  0.052684855  0.029367105
[6]  0.006049355 -0.017268395 -0.040586145 -0.063903895

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.338 1.316 1.659 1.325 0.651 0.654 0.640 0.956
VaR Breaks (%) 0.236 0.236 0.316 0.256 0.076 0.076 0.064 0.160
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v10_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2008_bond_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2149814

$rect$left
[1] -14.44

$rect$top
[1] 0.145146


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.123647828  0.102149692  0.080651555  0.059153418  0.037655282
[6]  0.016157145 -0.005340992 -0.026839129 -0.048337265

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.641 1.575 1.840 1.586 1.077 1.066 1.068 1.366
VaR Breaks (%) 0.308 0.304 0.364 0.308 0.144 0.156 0.140 0.224
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)
# 1%, 5%, 10% VaR - 2008 - 4th set of predictors
# var_1pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2008_bond_etf.csv", uv_list = var_1pc_2008_usetf[[1]])
# var_5pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2008_bond_etf.csv", uv_list = var_5pc_2008_usetf[[1]])
# var_10pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2008_bond_etf.csv", uv_list = var_10pc_2008_usetf[[1]])

All ETFs

# Call the above function
v1_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2008_all_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2924744

$rect$left
[1] -14.44

$rect$top
[1] 0.1485951


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.119347654  0.090100217  0.060852779  0.031605341  0.002357904
[6] -0.026889534 -0.056136972 -0.085384410 -0.114631847

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.736 0.737 1.733 0.863 0.208 0.213 0.219 0.355
VaR Breaks (%) 0.104 0.108 0.216 0.104 0.028 0.028 0.028 0.060
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v5_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2008_all_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2497963

$rect$left
[1] -14.44

$rect$top
[1] 0.1466955


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.121715910  0.096736284  0.071756657  0.046777030  0.021797403
[6] -0.003182224 -0.028161851 -0.053141478 -0.078121104

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.148 1.236 2.391 1.371 0.651 0.654 0.640 0.956
VaR Breaks (%) 0.168 0.208 0.400 0.220 0.076 0.076 0.064 0.160
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

v10_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2008_all_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.2149814

$rect$left
[1] -14.44

$rect$top
[1] 0.145146


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.123647828  0.102149692  0.080651555  0.059153418  0.037655282
[6]  0.016157145 -0.005340992 -0.026839129 -0.048337265

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 1.521 1.549 1.797 1.644 1.077 1.066 1.068 1.366
VaR Breaks (%) 0.284 0.288 0.344 0.292 0.144 0.156 0.140 0.224
Note:
Calculated using 250 trading days from 2008-01-04 to 2008-12-30

# 1%, 5%, 10% VaR - 2008 - 5th set of predictors
# var_1pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2008_all_etf.csv", uv_list = var_1pc_2008_usetf[[1]])
# var_5pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2008_all_etf.csv", uv_list = var_5pc_2008_usetf[[1]])
# var_10pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2008_all_etf.csv", uv_list = var_10pc_2008_usetf[[1]])

2010 Ending

U.S. ETFs

# Call the above function
v1_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2010_us_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.1107265

$rect$left
[1] -14.36

$rect$top
[1] 0.04802718


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.036954528  0.025881876  0.014809223  0.003736570 -0.007336082
[6] -0.018408735 -0.029481388 -0.040554040 -0.051626693

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.128 0.119 0.155 0.128 0.079 0.08 0.086 0.191
VaR Breaks (%) 0.000 0.000 0.044 0.000 0.020 0.02 0.016 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v5_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2010_us_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.08063501

$rect$left
[1] -14.36

$rect$top
[1] 0.04668784


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.038624340  0.030560839  0.022497338  0.014433837  0.006370336
[6] -0.001693165 -0.009756666 -0.017820167 -0.025883668

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.369 0.369 0.468 0.379 0.336 0.336 0.343 0.492
VaR Breaks (%) 0.028 0.028 0.084 0.028 0.052 0.052 0.048 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v10_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2010_us_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07332455

$rect$left
[1] -14.36

$rect$top
[1] 0.04636246


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.039030006  0.031697551  0.024365096  0.017032642  0.009700187
[6]  0.002367732 -0.004964723 -0.012297178 -0.019629632

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.56 0.561 0.710 0.572 0.547 0.549 0.546 0.690
VaR Breaks (%) 0.08 0.072 0.132 0.080 0.080 0.088 0.084 0.028
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

# 1%, 5%, 10% VaR - 2010 - 1st set of predictors
# var_1pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2010_us_etf.csv", uv_list = var_1pc_2010_usetf[[1]])
# var_5pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2010_us_etf.csv", uv_list = var_5pc_2010_usetf[[1]])
# var_10pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2010_us_etf.csv", uv_list = var_10pc_2010_usetf[[1]])

Global ETFs

# Call the above function
v1_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2010_glob_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.1214453

$rect$left
[1] -14.36

$rect$top
[1] 0.04850426


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  3.635973e-02  2.421520e-02  1.207067e-02 -7.386678e-05 -1.221840e-02
[6] -2.436293e-02 -3.650746e-02 -4.865200e-02 -6.079653e-02

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.133 0.136 0.110 0.127 0.079 0.08 0.086 0.191
VaR Breaks (%) 0.000 0.000 0.004 0.000 0.020 0.02 0.016 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v5_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2010_glob_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.08025361

$rect$left
[1] -14.36

$rect$top
[1] 0.04667087


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.038645504  0.030620143  0.022594782  0.014569420  0.006544059
[6] -0.001481303 -0.009506664 -0.017532026 -0.025557387

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.386 0.371 0.449 0.401 0.336 0.336 0.343 0.492
VaR Breaks (%) 0.024 0.024 0.068 0.024 0.052 0.052 0.048 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v10_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2010_glob_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07332455

$rect$left
[1] -14.36

$rect$top
[1] 0.04636246


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.039030006  0.031697551  0.024365096  0.017032642  0.009700187
[6]  0.002367732 -0.004964723 -0.012297178 -0.019629632

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.606 0.606 0.664 0.590 0.547 0.549 0.546 0.690
VaR Breaks (%) 0.040 0.040 0.128 0.068 0.080 0.088 0.084 0.028
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

# 1%, 5%, 10% VaR - 2010 - 2nd set of predictors
# var_1pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2010_glob_etf.csv", uv_list = var_1pc_2010_usetf[[1]])
# var_5pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2010_glob_etf.csv", uv_list = var_5pc_2010_usetf[[1]])
# var_10pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2010_glob_etf.csv", uv_list = var_10pc_2010_usetf[[1]])

Commodity ETFs

# 1%, 5%, 10% VaR - 2010 - 3rd set of predictors
# var_1pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2010_comm_etf.csv", uv_list = var_1pc_2010_usetf[[1]])
# var_5pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2010_comm_etf.csv", uv_list = var_5pc_2010_usetf[[1]])
# var_10pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2010_comm_etf.csv", uv_list = var_10pc_2010_usetf[[1]])

Bond ETFs

# Call the above function
v1_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2010_bond_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.1152507

$rect$left
[1] -14.36

$rect$top
[1] 0.04822855


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.036703479  0.025178413  0.013653347  0.002128282 -0.009396784
[6] -0.020921850 -0.032446916 -0.043971982 -0.055497048

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.131 0.13 0.129 0.128 0.079 0.08 0.086 0.191
VaR Breaks (%) 0.000 0.00 0.016 0.004 0.020 0.02 0.016 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v5_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2010_bond_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07740231

$rect$left
[1] -14.36

$rect$top
[1] 0.04654396


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0388037262  0.0310634948  0.0233232634  0.0155830319  0.0078428005
[6]  0.0001025691 -0.0076376623 -0.0153778937 -0.0231181251

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.373 0.372 0.494 0.378 0.336 0.336 0.343 0.492
VaR Breaks (%) 0.028 0.028 0.104 0.028 0.052 0.052 0.048 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v10_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2010_bond_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07332455

$rect$left
[1] -14.36

$rect$top
[1] 0.04636246


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.039030006  0.031697551  0.024365096  0.017032642  0.009700187
[6]  0.002367732 -0.004964723 -0.012297178 -0.019629632

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.566 0.565 0.659 0.578 0.547 0.549 0.546 0.690
VaR Breaks (%) 0.076 0.076 0.128 0.080 0.080 0.088 0.084 0.028
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)
# 1%, 5%, 10% VaR - 2010 - 4th set of predictors
# var_1pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2010_bond_etf.csv", uv_list = var_1pc_2010_usetf[[1]])
# var_5pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2010_bond_etf.csv", uv_list = var_5pc_2010_usetf[[1]])
# var_10pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2010_bond_etf.csv", uv_list = var_10pc_2010_usetf[[1]])

All ETFs

# Call the above function
v1_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2010_all_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.1208271

$rect$left
[1] -14.36

$rect$top
[1] 0.04847675


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0363940349  0.0243113225  0.0122286101  0.0001458977 -0.0119368147
[6] -0.0240195271 -0.0361022395 -0.0481849520 -0.0602676644

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.146 0.136 0.114 0.128 0.079 0.08 0.086 0.191
VaR Breaks (%) 0.000 0.000 0.000 0.000 0.020 0.02 0.016 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v5_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2010_all_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07812137

$rect$left
[1] -14.36

$rect$top
[1] 0.04657596


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0387638248  0.0309516875  0.0231395502  0.0153274129  0.0075152756
[6] -0.0002968618 -0.0081089991 -0.0159211364 -0.0237332737

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.394 0.394 0.436 0.397 0.336 0.336 0.343 0.492
VaR Breaks (%) 0.024 0.024 0.068 0.028 0.052 0.052 0.048 0.000
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

v10_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2010_all_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.07332455

$rect$left
[1] -14.36

$rect$top
[1] 0.04636246


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.039030006  0.031697551  0.024365096  0.017032642  0.009700187
[6]  0.002367732 -0.004964723 -0.012297178 -0.019629632

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.595 0.594 0.664 0.596 0.547 0.549 0.546 0.690
VaR Breaks (%) 0.044 0.044 0.120 0.076 0.080 0.088 0.084 0.028
Note:
Calculated using 250 trading days from 2010-01-05 to 2010-12-30

# 1%, 5%, 10% VaR - 2010 - 5th set of predictors
# var_1pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2010_all_etf.csv", uv_list = var_1pc_2010_usetf[[1]])
# var_5pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2010_all_etf.csv", uv_list = var_5pc_2010_usetf[[1]])
# var_10pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2010_all_etf.csv", uv_list = var_10pc_2010_usetf[[1]])

2014 Ending

U.S. ETFs

# Call the above function
v1_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2014_us_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.08062165

$rect$left
[1] -14.44

$rect$top
[1] 0.02801616


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.019953999  0.011891835  0.003829670 -0.004232495 -0.012294660
[6] -0.020356824 -0.028418989 -0.036481154 -0.044543319

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.083 0.075 0.173 0.071 0.061 0.057 0.063 0.061
VaR Breaks (%) 0.000 0.000 0.072 0.004 0.008 0.004 0.012 0.028
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v5_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2014_us_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.04998479

$rect$left
[1] -14.44

$rect$top
[1] 0.02665255


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.021654073  0.016655593  0.011657114  0.006658635  0.001660155
[6] -0.003338324 -0.008336803 -0.013335283 -0.018333762

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.242 0.241 0.229 0.238 0.226 0.218 0.225 0.240
VaR Breaks (%) 0.024 0.028 0.044 0.032 0.052 0.048 0.052 0.056
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v10_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2014_us_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.05001813

$rect$left
[1] -14.44

$rect$top
[1] 0.02665404


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.021652223  0.016650409  0.011648596  0.006646782  0.001644969
[6] -0.003356845 -0.008358658 -0.013360471 -0.018362285

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.388 0.362 0.368 0.367 0.367 0.359 0.364 0.368
VaR Breaks (%) 0.060 0.056 0.080 0.076 0.116 0.104 0.112 0.132
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

# 1%, 5%, 10% VaR - 2014 - 1st set of predictors
# var_1pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2014_us_etf.csv", uv_list = var_1pc_2014_usetf[[1]])
# var_5pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2014_us_etf.csv", uv_list = var_5pc_2014_usetf[[1]])
# var_10pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2014_us_etf.csv", uv_list = var_10pc_2014_usetf[[1]])

Global ETFs

# Call the above function
v1_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2014_glob_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.07664323

$rect$left
[1] -14.44

$rect$top
[1] 0.02783909


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.020174766  0.012510442  0.004846119 -0.002818205 -0.010482528
[6] -0.018146852 -0.025811175 -0.033475499 -0.041139822

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.076 0.074 0.158 0.071 0.061 0.057 0.063 0.061
VaR Breaks (%) 0.000 0.000 0.096 0.000 0.008 0.004 0.012 0.028
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v5_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2014_glob_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.04998479

$rect$left
[1] -14.44

$rect$top
[1] 0.02665255


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.021654073  0.016655593  0.011657114  0.006658635  0.001660155
[6] -0.003338324 -0.008336803 -0.013335283 -0.018333762

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.240 0.245 0.241 0.245 0.226 0.218 0.225 0.240
VaR Breaks (%) 0.024 0.028 0.040 0.024 0.052 0.048 0.052 0.056
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v10_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2014_glob_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.04240951

$rect$left
[1] -14.44

$rect$top
[1] 0.02631538


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0220744337  0.0178334830  0.0135925323  0.0093515816  0.0051106308
[6]  0.0008696801 -0.0033712706 -0.0076122213 -0.0118531720

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.377 0.358 0.388 0.358 0.367 0.359 0.364 0.368
VaR Breaks (%) 0.056 0.048 0.084 0.068 0.116 0.104 0.112 0.132
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

# 1%, 5%, 10% VaR - 2014 - 2nd set of predictors
# var_1pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2014_glob_etf.csv", uv_list = var_1pc_2014_usetf[[1]])
# var_5pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2014_glob_etf.csv", uv_list = var_5pc_2014_usetf[[1]])
# var_10pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2014_glob_etf.csv", uv_list = var_10pc_2014_usetf[[1]])

Commodity ETFs

# 1%, 5%, 10% VaR - 2014 - 3rd set of predictors
# var_1pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2014_comm_etf.csv", uv_list = var_1pc_2014_usetf[[1]])
# var_5pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2014_comm_etf.csv", uv_list = var_5pc_2014_usetf[[1]])
# var_10pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2014_comm_etf.csv", uv_list = var_10pc_2014_usetf[[1]])

Bond ETFs

# Call the above function
v1_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2014_bond_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.06873553

$rect$left
[1] -14.44

$rect$top
[1] 0.02748713


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  2.061357e-02  1.374002e-02  6.866467e-03 -7.086458e-06 -6.880640e-03
[6] -1.375419e-02 -2.062775e-02 -2.750130e-02 -3.437485e-02

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.079 0.075 0.072 0.070 0.061 0.057 0.063 0.061
VaR Breaks (%) 0.000 0.000 0.000 0.004 0.008 0.004 0.012 0.028
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v5_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2014_bond_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.05186546

$rect$left
[1] -14.44

$rect$top
[1] 0.02673626


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0215497125  0.0163631669  0.0111766212  0.0059900756  0.0008035299
[6] -0.0043830157 -0.0095695614 -0.0147561070 -0.0199426527

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.241 0.237 0.231 0.237 0.226 0.218 0.225 0.240
VaR Breaks (%) 0.028 0.012 0.040 0.024 0.052 0.048 0.052 0.056
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v10_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2014_bond_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.04240951

$rect$left
[1] -14.44

$rect$top
[1] 0.02631538


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0220744337  0.0178334830  0.0135925323  0.0093515816  0.0051106308
[6]  0.0008696801 -0.0033712706 -0.0076122213 -0.0118531720

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.370 0.364 0.371 0.352 0.367 0.359 0.364 0.368
VaR Breaks (%) 0.056 0.044 0.072 0.064 0.116 0.104 0.112 0.132
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)
# 1%, 5%, 10% VaR - 2014 - 4th set of predictors
# var_1pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2014_bond_etf.csv", uv_list = var_1pc_2014_usetf[[1]])
# var_5pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2014_bond_etf.csv", uv_list = var_5pc_2014_usetf[[1]])
# var_10pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2014_bond_etf.csv", uv_list = var_10pc_2014_usetf[[1]])

All ETFs

# Call the above function
v1_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2014_all_etf.csv", 0.01)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.09857866

$rect$left
[1] -14.44

$rect$top
[1] 0.02881541


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0189575446  0.0090996786 -0.0007581874 -0.0106160534 -0.0204739194
[6] -0.0303317854 -0.0401896514 -0.0500475174 -0.0599053834

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.087 0.073 0.107 0.079 0.061 0.057 0.063 0.061
VaR Breaks (%) 0.008 0.008 0.052 0.008 0.008 0.004 0.012 0.028
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v5_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2014_all_etf.csv", 0.05)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.05462885

$rect$left
[1] -14.44

$rect$top
[1] 0.02685925


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0213963689  0.0159334842  0.0104705995  0.0050077148 -0.0004551699
[6] -0.0059180546 -0.0113809393 -0.0168438240 -0.0223067087

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.241 0.256 0.320 0.246 0.226 0.218 0.225 0.240
VaR Breaks (%) 0.024 0.032 0.084 0.028 0.052 0.048 0.052 0.056
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

v10_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2014_all_etf.csv", 0.10)
$rect
$rect$w
[1] 78.97413

$rect$h
[1] 0.04297524

$rect$left
[1] -14.44

$rect$top
[1] 0.02634056


$text
$text$x
[1] 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529 32.54529
[9] 32.54529

$text$y
[1]  0.0220430408  0.0177455173  0.0134479937  0.0091504702  0.0048529466
[6]  0.0005554231 -0.0037421005 -0.0080396240 -0.0123371476

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.371 0.359 0.370 0.361 0.367 0.359 0.364 0.368
VaR Breaks (%) 0.056 0.044 0.072 0.056 0.116 0.104 0.112 0.132
Note:
Calculated using 250 trading days from 2014-01-03 to 2014-12-30

# 1%, 5%, 10% VaR - 2014 - 5th set of predictors
# var_1pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2014_all_etf.csv", uv_list = var_1pc_2014_usetf[[1]])
# var_5pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2014_all_etf.csv", uv_list = var_5pc_2014_usetf[[1]])
# var_10pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2014_all_etf.csv", uv_list = var_10pc_2014_usetf[[1]])

2016 Ending

U.S. ETFs

# Call the above function
v1_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2016_us_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.06358078

$rect$left
[1] -14.36

$rect$top
[1] 0.02691495


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.020556869  0.014198791  0.007840714  0.001482636 -0.004875442
[6] -0.011233520 -0.017591597 -0.023949675 -0.030307753

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.087 0.093 0.085 0.09 0.078 0.082 0.078 0.077
VaR Breaks (%) 0.020 0.020 0.028 0.02 0.012 0.020 0.012 0.004
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v5_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2016_us_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05800696

$rect$left
[1] -14.36

$rect$top
[1] 0.02991372


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0241130210  0.0183123252  0.0125116294  0.0067109335  0.0009102377
[6] -0.0048904581 -0.0106911540 -0.0164918498 -0.0222925456

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.278 0.297 0.257 0.290 0.238 0.238 0.234 0.264
VaR Breaks (%) 0.064 0.056 0.080 0.068 0.032 0.040 0.028 0.032
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v10_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2016_us_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05451043

$rect$left
[1] -14.36

$rect$top
[1] 0.02651124


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0210601926  0.0156091498  0.0101581069  0.0047070640 -0.0007439789
[6] -0.0061950217 -0.0116460646 -0.0170971075 -0.0225481504

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.419 0.415 0.401 0.429 0.370 0.373 0.368 0.414
VaR Breaks (%) 0.104 0.100 0.120 0.108 0.088 0.092 0.096 0.072
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

# 1%, 5%, 10% VaR - 2016 - 1st set of predictors
# var_1pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2016_us_etf.csv", uv_list = var_1pc_2016_usetf[[1]])
# var_5pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2016_us_etf.csv", uv_list = var_5pc_2016_usetf[[1]])
# var_10pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2016_us_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

Global ETFs

# Call the above function
v1_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2016_glob_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.06358078

$rect$left
[1] -14.36

$rect$top
[1] 0.02691495


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.020556869  0.014198791  0.007840714  0.001482636 -0.004875442
[6] -0.011233520 -0.017591597 -0.023949675 -0.030307753

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.09 0.098 0.085 0.087 0.078 0.082 0.078 0.077
VaR Breaks (%) 0.02 0.020 0.028 0.016 0.012 0.020 0.012 0.004
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v5_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2016_glob_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05508902

$rect$left
[1] -14.36

$rect$top
[1] 0.02653699


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.021028086  0.015519184  0.010010282  0.004501380 -0.001007522
[6] -0.006516424 -0.012025326 -0.017534228 -0.023043130

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.279 0.261 0.253 0.291 0.238 0.238 0.234 0.264
VaR Breaks (%) 0.068 0.040 0.048 0.080 0.032 0.040 0.028 0.032
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v10_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2016_glob_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05451043

$rect$left
[1] -14.36

$rect$top
[1] 0.02651124


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0210601926  0.0156091498  0.0101581069  0.0047070640 -0.0007439789
[6] -0.0061950217 -0.0116460646 -0.0170971075 -0.0225481504

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.419 0.400 0.400 0.442 0.370 0.373 0.368 0.414
VaR Breaks (%) 0.104 0.096 0.116 0.112 0.088 0.092 0.096 0.072
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

# 1%, 5%, 10% VaR - 2016 - 2nd set of predictors
# var_1pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2016_glob_etf.csv", uv_list = var_1pc_2016_usetf[[1]])
# var_5pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2016_glob_etf.csv", uv_list = var_5pc_2016_usetf[[1]])
# var_10pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2016_glob_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

Commodity ETFs

# 1%, 5%, 10% VaR - 2016 - 3rd set of predictors
# var_1pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2016_comm_etf.csv", uv_list = var_1pc_2016_usetf[[1]])
# var_5pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2016_comm_etf.csv", uv_list = var_5pc_2016_usetf[[1]])
# var_10pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2016_comm_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

Bond ETFs

# Call the above function
v1_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2016_bond_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.06358078

$rect$left
[1] -14.36

$rect$top
[1] 0.02691495


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.020556869  0.014198791  0.007840714  0.001482636 -0.004875442
[6] -0.011233520 -0.017591597 -0.023949675 -0.030307753

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.076 0.089 0.108 0.085 0.078 0.082 0.078 0.077
VaR Breaks (%) 0.012 0.024 0.028 0.016 0.012 0.020 0.012 0.004
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v5_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2016_bond_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05508902

$rect$left
[1] -14.36

$rect$top
[1] 0.02653699


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.021028086  0.015519184  0.010010282  0.004501380 -0.001007522
[6] -0.006516424 -0.012025326 -0.017534228 -0.023043130

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.257 0.265 0.273 0.273 0.238 0.238 0.234 0.264
VaR Breaks (%) 0.040 0.044 0.060 0.060 0.032 0.040 0.028 0.032
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v10_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2016_bond_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05451043

$rect$left
[1] -14.36

$rect$top
[1] 0.02651124


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0210601926  0.0156091498  0.0101581069  0.0047070640 -0.0007439789
[6] -0.0061950217 -0.0116460646 -0.0170971075 -0.0225481504

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.402 0.395 0.397 0.415 0.370 0.373 0.368 0.414
VaR Breaks (%) 0.100 0.096 0.108 0.084 0.088 0.092 0.096 0.072
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)
# 1%, 5%, 10% VaR - 2016 - 4th set of predictors
# var_1pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2016_bond_etf.csv", uv_list = var_1pc_2016_usetf[[1]])
# var_5pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2016_bond_etf.csv", uv_list = var_5pc_2016_usetf[[1]])
# var_10pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2016_bond_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

All ETFs

# Call the above function
v1_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2016_all_etf.csv", 0.01)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.06358078

$rect$left
[1] -14.36

$rect$top
[1] 0.02691495


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.020556869  0.014198791  0.007840714  0.001482636 -0.004875442
[6] -0.011233520 -0.017591597 -0.023949675 -0.030307753

Comparison of VaR Methods for a 1% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.091 0.097 0.092 0.083 0.078 0.082 0.078 0.077
VaR Breaks (%) 0.020 0.020 0.028 0.016 0.012 0.020 0.012 0.004
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v5_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2016_all_etf.csv", 0.05)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05508902

$rect$left
[1] -14.36

$rect$top
[1] 0.02653699


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.021028086  0.015519184  0.010010282  0.004501380 -0.001007522
[6] -0.006516424 -0.012025326 -0.017534228 -0.023043130

Comparison of VaR Methods for a 5% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.26 0.265 0.283 0.272 0.238 0.238 0.234 0.264
VaR Breaks (%) 0.06 0.048 0.092 0.056 0.032 0.040 0.028 0.032
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

v10_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2016_all_etf.csv", 0.10)
$rect
$rect$w
[1] 78.5366

$rect$h
[1] 0.05451043

$rect$left
[1] -14.36

$rect$top
[1] 0.02651124


$text
$text$x
[1] 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498 32.36498
[9] 32.36498

$text$y
[1]  0.0210601926  0.0156091498  0.0101581069  0.0047070640 -0.0007439789
[6] -0.0061950217 -0.0116460646 -0.0170971075 -0.0225481504

Comparison of VaR Methods for a 10% VaR
M1 M2 M3 M4 M5 M6 M7 M8
Losses 0.425 0.397 0.401 0.441 0.370 0.373 0.368 0.414
VaR Breaks (%) 0.096 0.096 0.112 0.100 0.088 0.092 0.096 0.072
Note:
Calculated using 250 trading days from 2016-01-06 to 2016-12-30

# 1%, 5%, 10% VaR - 2016 - 5th set of predictors
# var_1pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2016_all_etf.csv", uv_list = var_1pc_2016_usetf[[1]])
# var_5pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2016_all_etf.csv", uv_list = var_5pc_2016_usetf[[1]])
# var_10pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2016_all_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

Conclusions and Future Work

The problem of how to predict a low quantile of a stock’s log return when the training sample is substantially different than the test scenario is an enormously difficult problem. Almost axiomatically, the distribution is nonstationary over time. How is it possible to predict the return of an index like the S&P500 during a period of market turmoil such as the great recession? While the CAViaR model performs comparatively well during times of stress, it performs about the same as the multivariate model during more benign economic periods.

This conclusion drawn from the above results might support the notion of combining the two models in some sort of a mixture model - aiming to use the basket of ETFs during good times, and use the CAViaR ARMA specification during bad times. The approach of using ETFs allows a prediction based on forward-looking expectations of fundamental factors. Indeed, ETFs are just baskets of individual stocks or bonds, and those securities are (in theory) based on rational expectations about future resources, market conditions, etc - the microfoundations of what drives our economy. The ARMA specification, while practically and statistically sound, is contradicted by economic theory and practice - the weak form of the efficient market hypothesis states that it is impossible to forecast future values of asset prices using past values. But perhaps this view is incomplete.

Any model that attempts to capture relationships in the real world will only work until an omitted variable is found. The elegance of the multivariate CAViaR model is that it provides insight into why a prediction is wrong; the change in the angle between resultant vectors is a sensible measurement of economic changepoints (CHANGE). However, errors in the world are costly, and it’s wishful thinking to say that explaining why the error occured is sufficient.

As such, for future work it’s worth exploring the notion of weighting an ARMA-approach more heavily when predictions using fundamentals were too high, then not only would this after-the-fact recognition be achieves, but also a hierarchical model that captures fundamental relationships in the economy and potentially changes our understanding of asset prices in general - a synthesis between Keynes’ animal spirits during a time of severe crisis; where a model cannot explain shifts, and a more rational world that explains other periods. In addition to significant predictive power because of the switching between the two worlds, there’s also an elegant explanation; a way to explain changes in the usefulness of the underpinnings in the economy. Because of the flexibility of the model, it’s entirely possible that a whole gamut of variables could be tossed in and backtested to when “changepoints” occurred.

Code Appendix

knitr::opts_chunk$set(fig.width=12, fig.height=8, fig.path='Figs/',
                      echo=FALSE, warning=FALSE, message=FALSE, cache = TRUE)
# Read in relevant libraries
library(microbenchmark)
library(data.table)
library(quantmod)
library(ggplot2)
library(tseries)
library(zoo)
library(magrittr)
library(dplyr)
library(kableExtra)
library(formattable)
library(quantreg)
library(MTS)
library(plot3D)
library(citr)

# Set up working directory
# setwd("~/Documents/GitHub/CaviaR")

# source('caviar_SM.R')
source('~/Documents/GitHub/CaviaR/caviar_SM.R')
# This code below is for use in the CAViaR sections.
# Here is code that I'll wrap some parts in to avoid superfluous output
quiet <- function(x) { 
  sink(tempfile()) 
  on.exit(sink()) 
  invisible(force(x)) 
} 
#' This is a function which pulls data for use in the CAViaR model
#'
#' @param symbol - symbol to pull
#' @param compl_case - defaults to true...only includes complete cases in the data
#' @param adj_close - use adjusted closing prices. Default is yes.
#' @param log_return - use log return? Default is yes.
#'
#' @return - a data frame which can be fed into later functions
#' @export
#'
#' @examples - data_pull("SPY")
data_pull = function(symbol, compl_case = 1, adj_close = 1, log_return = 1, start_date = "1900-01-01", end_date = Sys.Date()){
  # Pull in data from quantmod
  response_pull = getSymbols(symbol, auto.assign = FALSE, from = start_date, to = end_date)
  # Get adjusted closing price
  if (adj_close == TRUE){
    df = Ad(response_pull)
  } else {
    df = Cl(response_pull)
  }
  # Return complete cases only 
  if (compl_case == TRUE){
    df = df[complete.cases(df), ]
  } else{
    df = df
  }
  # Calculate log return of data
  if (log_return == TRUE){
    lr = log(df[,1]/shift(df[,1], 1, type = "lag"))
    # Combine data
    df_out = cbind(df, lr)
    # Rename the data 
    colnames(df_out) <- c(sym=symbol, paste0(symbol, "_log_return"))
  } else{
    df_out = df
  }
  # Return data
  return(df_out)
}


#' Pull the data and run the CAViaR function on it
#'
#' @param input_data - data to use in the function
#' @param range_data - range of the data to use
#'
#' @return - a list of values from the caviar function
#' @export
#'
#' @examples - caviar_pull(spy)
caviar_pull = function(input_data, range_data = (2:dim(input_data)[1])){
  # Run the caviar data
  caviar <- caviarOptim(input_data[range_data,2])
  return(caviar)
}

#' Function for producing rolling predictions
#' Model 1 = Symmetric Absolute Value, 2 = Asymmetric slope, 3 = Indirect GARCH, 4 = Adaptive
#'
#' @param input_data - input data from the previous function
#' @param range_data - range of the data to consider
#' @param nfcst - number of forecasts to make
#' @param model - model to use (integers 1 through 4). Defaults to 1. 
#' @param level - level of significance to use.
#' @param G - argument for the k parameter in the 4th model (adaptive). Default is 5
#'
#' @return - an xts object which contains rolling CAViaR predictions
#' @export
#'
#' @examples - rolling_predictions(spy, nfcst = 22)
rolling_predictions = function(input_data, range_data = (2:dim(input_data)[1]), nfcst = 250, model =1, level = 0.01, G = 5, col = 2){
  # Run the varpredict function
  varpredict <- rollapplyr(input_data[range_data,col], length(range_data) - nfcst, caviarOptim, model, level, predict = 1, k = G) %>% lag
  # Eliminate NAs
  # pred_no_na = na.omit(varpredict)
  # Return the data
  # return(pred_no_na)
  return(varpredict)
}

#' Function to Calculate Loss from the above predictions
#'
#' @param symbol - symbol to work with from quantmod. Must be in quotations to work
#' @param start_dt - start date of the data to build the forecast on 
#' @param end_dt - end date of the data to build the forecast on  
#' @param nfcst - number of data points to use in the forecast
#' @param model - model to use. Defaults to 1
#' @param level - level of significance. Defaults to 1%
#' @param G - argument for the k parameter in the 4th model (adaptive). Default is 5
#'
#' @return - loss using absolute value
#' @export - a plot of the data
#'
#' @examples
loss_calc_uv = function(symbol, start_dt, end_dt, nfcst, model = 1, level = 0.01, G = 5){
  # Pull in the data
  raw_data = data_pull(symbol, start_date = start_dt, end_date = end_dt)
  # Forecast based on the data
  fcst = na.omit(rolling_predictions(raw_data, nfcst = nfcst, model = model, level = level, G = G))*(-1)
  # Extract actuals
  act = tail(raw_data, n = nfcst)[,2]
  # Join the two together and rename
  join = merge(fcst,act,all=TRUE)
  colnames(join) <- c("Fcst_VaR", "Act_Return")
  # print(join)
  # Calculate the losses
  loss = abs(sum(ifelse(act > fcst, level, (-1)*(1-level))))
  # Plot the data
  plot = plot.xts(join, col = c("red", "black"), lty = c(2,1), main = "Log Return from the SPY vs. Fcst. VaR",grid.col = NA, legend.loc = "bottomleft")
  return(list(loss, plot, act, fcst))
}

#' This is a function which creates a data frame for the response and explanatory variables that we'll feed into the diffusion index
#'
#' @param symbol_list - a list of symbols recognizable by the 
#' @param resp_var - the response variable we'd like to forecast; default is SPY
#' @param compl_case - defaults to true...only includes complete cases in the data
#' @param adj_close - use adjusted closing prices for the explanatory variables? default is 1 for YES
#' @param resp_adj_close - use adjusted closing prices for the explanatory variables? default is 1 for YES
#' @param start_date - starting data to use
#' @param end_date - ending date of the data
#' @param lag_pred - do we lag the predictions? It is STRONGLY recommended that this is 0
#'
#' @return - a data frame which can be fed into the SWfore function
#' @export
#'
#' @examples - diff_index_df(c("XLF", "XLE", "PSCT", "XLV", "VPU", "XLP", "IGF", "XWEB", "PPTY"))
diff_index_df = function(symbol_list, resp_var = "SPY", compl_case = 1, adj_close = 1, resp_adj_close = 1, start_date = "1900-01-01", end_date = Sys.Date(), lag_pred = 1){
  # Pull in response variable
  response_pull = getSymbols(resp_var, auto.assign = FALSE, from = start_date, to = end_date)
  # Get adjusted closing price
  if (resp_adj_close == TRUE){
    diff_df = Ad(response_pull)
  } else {
    diff_df = Cl(response_pull)
  }
  # Loop through the symbols and join in data
  for (i in 1:length(symbol_list)){
    # Pull closing price
    expl_pull = getSymbols(symbol_list[i], auto.assign = FALSE, from = start_date, to = end_date)
    # Extract closing price - 4th element
    if (adj_close == TRUE){
      expl_cl = Ad(expl_pull)
    } else {
      expl_cl = Cl(expl_pull)
    }
    # New code for 4.16.2020 - lag the explanatory variables
    if (lag_pred == TRUE){
      # Lag the explanatory variables by 1
      lag_exp = lag(expl_cl, 1)
      # Append the first lag to the data frame
      diff_df = merge(diff_df, lag_exp, join = "left", fill = NA)
    } else{
      # Return the data frame without lags
      diff_df = merge(diff_df, expl_cl, join = "left", fill = NA)
    }
  }
  if (lag_pred == TRUE){
    # Chop off the first row
    diff_df = diff_df[-1,]
  }
  else {
    print("PLEASE NOTE - the explanatory variables in this DF are NOT lagged. Be careful to avoid look-ahead bias!")
  }
  # Return complete cases only 
  if (compl_case == TRUE){
    diff_df_out = diff_df[complete.cases(diff_df), ]
  } else{
    diff_df_out = diff_df
  }
  
  return(diff_df_out)
}

#' Converts a diff_df into a data frame with approximate percentage changes diff(log(diff_df))
#'
#' @param diff_df - output of the diff_index_df function with complete cases
#'
#' @return - retuns the differenced data
#' @export
#'
#' @examples - pc_diff_index(test_compl) 

pc_diff_index = function(diff_df){
  # Difference the log of the data
  pc_diff_index = diff(log(diff_df))
  # Remove the first row
  pc_diff_index_out = pc_diff_index[-1,]
  return(pc_diff_index_out)
}

#' Below is the modified diffusion index code.
#'
#' @param y - response variable
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param m - number of diffusion indexes used
#' @param tau - VaR level to use; must be between 0 and 1
#' @param end - specifies an alternate ending value
#' @param print_mdl - print the model summary and the MSE
#'
#' @return - returns a list of variables for use in the diffusion index
#' @export
#'
#' @examples
mod_di = function (y, x, orig, m, tau, end = NULL, print_mdl = 0) 
{
  # Converts the response variables into a matrix
  if (!is.matrix(x)) 
      x = as.matrix(x)
  # nT is number of t time-steps
  nT = dim(x)[1]
  # Add a line to establish the number of data points used in the test.
  if (is.null(end) != TRUE){
    nT = end
  }
  # k is the number of diffusion indices used
  k = dim(x)[2]
  # Sanity checks to ensure that the origin isn't past the number of time points
  if (orig > nT) 
      orig = nT
  # Makes sure that there aren't more predictors than there variables in the dataset
  if (m > k) 
      m = k
  # Makes sure there are at least some variables
  if (m < 1) 
      m = 1
  # Subdivides the dataframe
  x1 = x[1:orig, ]
  # Calculates means of each row
  me = apply(x1, 2, mean)
  # Calculates standard deviations of each column
  se = sqrt(apply(x1, 2, var))
  # Creates a matrix x1, which normalizes all the columns. 
  # This may be an issue since it assumes that the distribution is sufficiently described by the first two moments
  x1 = x
  for (i in 1:k) {
      x1[, i] = (x1[, i] - me[i])/se[i]
  }
  V1 = cov(x1[1:orig, ])
  # Performs an eigen decomposition
  m1 = eigen(V1)
  # Selects eigenvalues
  sdev = m1$values
  # Selects eigenvectors
  M = m1$vectors
  # Makes a smaller matrix
  M1 = M[, 1:m]
  # This is the diffusion index model - [orig x p]*[p x m] = [orig x m]
  Dindex = x1 %*% M1
  # Cut down both the response and predictors to be a reasonable size
  y1 = y[1:orig]
  DF = Dindex[1:orig, ]
  # Apply the linear model - HERE is the key.
  # mm = lm(y1 ~ DF) - old function
  mm = rq(y1 ~ DF, tau = tau)
  # Print the data
  if (print_mdl == 1){
    print(summary(mm))
  }
  # Puts coefficients in a matrix
  coef = matrix(mm$coefficients, (m + 1), 1)
  # Initializes yhat variables and MSE
  yhat = NULL
  MSE = NULL
  if (orig < nT) {
    # Creates a nfcst by (m+1) matrix
    newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, 
        ])
    # [nfcstx(m+1)]*[(m+1)x1] = [nfcstx1]
    yhat = newx %*% coef
    # Calculates errors
    err = y[(orig + 1):nT] - yhat
    MSE = mean(err^2)
    if (print_mdl == 1){
      cat("MSE of out-of-sample forecasts: ", MSE, "\n")
    }
  }
  SWfore <- list(coef = coef, yhat = yhat, MSE = MSE, loadings = M1, 
      DFindex = Dindex)
}

#' Below is the modified diffusion index code to include lagged variables.
#'
#' @param y - response variable
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param m - number of diffusion indexes used
#' @param tau - VaR level to use; must be between 0 and 1
#' @param ar_tf - AR transformation type. (1 - no transformation,
#' 2 - absolute value, 3 - asymmetric slope)
#' @param p - number of AR lags to include. Default is one.
#' @param print_mdl - option to print the model summary to make sure everytning is ok. 0 is default.
#' @param model - model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
#'
#' @return - returns a list of variables for use in the diffusion index
#' @export
#'
#' @examples
mod_di_wl = function (y, x, orig, m, tau, ar_tf = 1, p = 1, print_mdl = 0, model = 1, end = NULL) 
{
  # Converts the response variables into a matrix
  if (!is.matrix(x)) 
      x = as.matrix(x)
  # nT is number of t time-steps
  nT = dim(x)[1]
  # Add a line to establish the number of data points used in the test.
  if (is.null(end) != TRUE){
    nT = end
  }
  # k is the number of diffusion indices used
  k = dim(x)[2]
  # Sanity checks to ensure that the origin isn't past the number of time points
  if (orig > nT) 
      orig = nT
  # Makes sure that there aren't more predictors than there variables in the dataset
  if (m > k) 
      m = k
  # Makes sure there are at least some variables
  if (m < 1) 
      m = 1
  # Subdivides the dataframe
  x1 = x[1:orig, ]
  # Calculates means of each row
  me = apply(x1, 2, mean)
  # Calculates standard deviations of each column
  se = sqrt(apply(x1, 2, var))
  # Creates a matrix x1, which normalizes all the columns. 
  # This may be an issue since it assumes that the distribution is sufficiently described by the first two moments
  x1 = x
  for (i in 1:k) {
      x1[, i] = (x1[, i] - me[i])/se[i]
  }
  V1 = cov(x1[1:orig, ])
  # Performs an eigen decomposition
  m1 = eigen(V1)
  # Selects eigenvalues
  sdev = m1$values
  # Selects eigenvectors
  M = m1$vectors
  # Makes a smaller matrix
  M1 = M[, 1:m]
  # This is the diffusion index model - [orig x p]*[p x m] = [orig x m]
  Dindex = x1 %*% M1
  # Cut down both the response and predictors to be a reasonable size
  y1 = y[1:orig]
  DF = Dindex[1:orig, ]
  # Copy the data frame
  DF_wl = Dindex
  # Lag the y-variable
  for (i in 1:p){
    # Create a lagged variable
    lag_var = lag(y, i)
    # Append the first lag to the data frame
    DF_wl = cbind(DF_wl,lag_var)
  }
  # Identify the right columns
  l_ar = ncol(DF_wl)
  f_ar = l_ar - p + 1
  # Keep the last columns kept to the side
  all_lag = DF_wl[,(f_ar:l_ar)]
  # Cut off the first row to avoid NA's
  DF_trim = DF_wl[1:orig,]
  # Rename the columns
  # Here's the new function with an untransformed AR(p) lag
  if (ar_tf == 1){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),])
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Assign the names
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
  }
  # Here's the new function with an SAV AR(p) lag
  if (ar_tf == 2){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),-(f_ar:l_ar)], abs(DF_trim[-(1:p),(f_ar:l_ar)]))
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Assign the names. Note that this is a matrix
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
  }
  # Here's the new function with an asymmetric slope for the AR(1) lag
  # Indicator; 0 if percent change is negative, 1 if it's positive
  # indi = ifelse(DF_trim[,ar] < 0, 0, 1)
  if (ar_tf == 3){
    # Create a matrix of indicators
    indi_mat = matrix(0, nrow(DF_wl), p)
    # Generalize the above code
    for (i in 1:p){
      # Populate the indicator
      indi_mat[,i] = ifelse(DF_wl[,f_ar + i - 1] < 0, 0, 1)
    }
  }
  # Fitting the regression
  if (ar_tf == 3){
    # Incorporate everything in to an input data frame
    df_in = cbind(y1[-(1:p)], DF_trim[-(1:p),-(f_ar:l_ar)], DF_trim[-(1:p),(f_ar:l_ar)], indi_mat[((p+1):orig),])
    # Rename the columns
    # Initialize a character vector
    nvec = c(rep(0, 1+m+2*p))
    # Populate the vector - first value is the response
    nvec[1] <- names(y)
    # Next are the diffusion indices
    for (i in 1:m){
      nvec[i+1] = paste0("Diff_Index_", i)
    }
    # Next are the lagged variables
    for (i in 1:p){
      nvec[i+1+m] = paste0("Lag_", i)
    }
    # Last are the positive indicator variables
    for (i in 1:p){
      nvec[i+1+m+p] = paste0("Pos_Val_for_Lag_", i)
    }
    # Assign the names. Note that this is a matrix
    names(df_in) <- nvec
    # Run the model
    mm = rq(df_in[,1] ~ df_in[,-1], tau = tau)
    # mm = rq(y1[-(1:p)] ~ DF_trim[-(1:p),-(f_ar:l_ar)] + DF_trim[-(1:p),(f_ar:l_ar)] + indi_mat[((p+1):orig),], tau = tau)
    # Add a different line to account for the indicator variable
    # intercept + m + 2*nlag to account for the number of indicator variables
    coef = matrix(mm$coefficients, (1 + m + 2*p), 1)
  }
  if (print_mdl == 1){
    print(summary(mm))
  }
  # Puts coefficients in a matrix - added the AR terms
  # coef = matrix(mm$coefficients, (m + 1), 1)
  if (ar_tf != 3){
    coef = matrix(mm$coefficients, (1 + m + p), 1)
  }
  # Initializes yhat variables and MSE
  yhat = NULL
  loss = NULL
  if (orig < nT) {
    # Creates a nfcst by (m+2) matrix
    # Add on the lagged variables
    newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, ], all_lag[(orig+1):nT,])
    # Incorporate lagged variables
    if (ar_tf == 3){
      newx = cbind(rep(1, (nT - orig)), Dindex[(orig + 1):nT, ], all_lag[(orig+1):nT,], indi_mat[(orig+1):nT,])
    }
    # [nfcstx(m+1)]*[(m+1)x1] = [nfcstx1]
    yhat = newx %*% coef
    # Calculates errors
    loss = abs(sum(ifelse(y[(orig + 1):nT] > yhat, tau, (-1)*(1-tau))))
    # Modifying this part to only print this if specified
    if (print_mdl == 1){
      cat("Losses of out-of-sample forecasts: ", loss, "\n")
    }
  }
  SWfore <- list(coef = coef, yhat = yhat, loss = loss, loadings = M1, 
      DFindex = Dindex, name_vector = nvec)
}

# Decide on the optimal number of vectors.

# (y, x, orig, m, tau) 

#' Function that calculates loss over a given period of time for the diffusion index model
#'
#' @param y - response variables
#' @param x - explanatory variable
#' @param orig - forecast origin
#' @param end - forecasting ending. Note: as the function is currently written on 2/24, this option doesn't do anything.
#' @param m - number of diffusion indices to use
#' @param tau - VaR level
#' @param mod_di - use the modified DI?
#'
#' @return - returns a list of the loss sum and the loss vector
#' @export
#'
#' @examples - loss_calc(pc_df[,1], pc_df[,-1], 757, 1027, 1, 0.01)
loss_calc = function(y, x, orig, m, tau, mod_di = 0, ar_tf = 1, p = 1, print_mdl = 0, model = 1, end = NULL){
  # Extract y_hat values
  if (mod_di == 0){
    di = mod_di(y=y,x=x,orig=orig,m=m, tau=tau, end = end, print_mdl = print_mdl)
  }
  else {
    di = mod_di_wl(y=y,x=x,orig=orig,m=m, tau=tau, ar_tf = ar_tf, p = p, print_mdl = print_mdl, model = model, end = end)
  }
  # mod_di_wl = function (y, x, orig, m, tau, ar_tf = 1, p = 1, print_mdl = 0, model = 1)
  yhat = di$yhat[1:(end-orig)]
  # Calculate the loss
  # Initialize loss vector
  lvec = rep(0,(end-orig))
  # Take the difference
  for (i in 1:(end-orig)){
    # Calculate an indicator variable
    ind = ifelse(y[orig+i] < yhat[i], 1,0)
    # Use indicator in function below
    lvec[i] = (tau - ind)*(y[orig+i] - yhat[i])
  }
  # Add up the losses - change to look at sum of losses. Won't change decision criterion
  sumloss = sum(lvec)
  # sumloss = sum(lvec)/length(lvec)
  return(list(sumloss,lvec))
}


#' Function that selects the optimal number of predictors
#'
#' @param y - response vector
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param end - ending of validation set
#' @param tau - VaR in question
#' @param low_m - low value of m to consider
#' @param high_m - high value of m to consider
#'
#' @return - returns the optimal value of m
#' @export
#'
#' @examples - opt_m(pc_df[,1], pc_df[,-1], 757, 1027, 0.01, low_m =1, high_m  = 5)
opt_m = function(y, x, orig, end = NULL, tau, low_m = 1, high_m, mod_di = 0, ar_tf = 1, p = 1, print_mdl = 0, model = 1, rowname = NULL){
  # Initialize a loss vector
  loss_vec = rep(0,high_m-low_m + 1)
  # Initialize an m vector
  m_vec = seq(low_m, high_m, by = 1)
  # Loop through and populate the loss vector
  for (i in 1:length(loss_vec)){
    loss_vec[i] = quiet(loss_calc(y=y,x=x,orig=orig,end=end, m = m_vec[i], tau = tau, mod_di = mod_di, ar_tf = ar_tf, p = p, print_mdl = print_mdl, model = model))[[1]]
  }
  # Find the minimizer
  opt_m = which.min(loss_vec)
  opt_p = NA
  # Combine into a data frame
  df = as.data.frame(cbind(opt_m, opt_p))
  names(df) <- c("Optimal m", "Optimal p")
  # Assign a rowname
  if (is.null(rowname) == TRUE){
    # Write the row names
    rownames(df) <- c("MV CAViaR")
  }
  else {
    rownames(df) <- rowname
  }
  # Return the loss_vector and the minimzer
  return(list(opt_m, loss_vec, df))
}
#' Function that selects the optimal number of lags
#'
#' @param y - response vector
#' @param x - predictor variables
#' @param orig - forecast origin
#' @param end - ending of validation set
#' @param tau - VaR in question
#' @param low_m - low value of m to consider
#' @param high_m - high value of m to consider
#'
#' @return - returns the optimal value of m
#' @export
#'
#' @examples - opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = 757, end = 1007, tau = 0.01, low_m =1, high_m  = 5, low_p = 1, high_p = 10, ar_tf = 2, mod_di = 1)
opt_mp = function(y, x, orig, end = NULL, tau, low_m = 1, high_m, low_p = 1, high_p, mod_di = 0, ar_tf = 1, print_mdl = 0, model = 1, print_mp = 0, rowname = NULL){
  # Initialize a loss matrix
  loss_mat = matrix(0, high_p-low_p + 1,high_m-low_m + 1)
  # Initialize a p vector
  p_vec = seq(low_p, high_p, by = 1)
  # Loop through and populate the loss vector
  for (i in 1:nrow(loss_mat)){
    loss_mat[i,] = opt_m(y = y, x = x, orig = orig, end = end, tau = tau, low_m = low_m, high_m  = high_m, p = i, mod_di = mod_di, ar_tf = ar_tf, print_mdl = print_mdl, model = model)[[2]]
  }
  # Find the minimizer
  opt_p = which(loss_mat == min(loss_mat), arr.ind = TRUE)[1,1]
  opt_m = which(loss_mat == min(loss_mat), arr.ind = TRUE)[1,2]
  # Print the optimal p and optimal m
  df = as.data.frame(cbind(opt_m, opt_p))
  names(df) <- c("Optimal m", "Optimal p")
  # Assign a rowname
  if (is.null(rowname) == TRUE){
    if (ar_tf == 1){
      # Write the row names
      rownames(df) <- c("MV CAViaR + AR")
    } else if (ar_tf == 2){
      # Write the row names
      rownames(df) <- c("MV CAViaR + SAV")
    } else if (ar_tf == 3){
      # Write the row names
      rownames(df) <- c("MV CAViaR + AS")
    } else {
      rownames(df) <- c("Unknown Model")
    }
  }
  else {
    rownames(df) <- rowname
  }
  # Print the df if the option is turned on
  if (print_mp == 1){
    print(df)
  }
  # Return the loss_vector and the minimzer
  return(list(opt_m, opt_p, loss_mat, df))
}
#' A function that combines optimal values of m and p into a final table
#'
#' @param m1 - the data frame from the "MV CAViaR" run
#' @param m2 - the data frame from the "MV CAViaR + AR" run
#' @param m3 - the data frame from the "MV CAViaR + SAV" run
#' @param m4 - the data frame from the "MV CAViaR + AS" run
#'
#' @return - a nicely formatted table
#' @export
#'
#' @examples - pretty_pm(opt_pred_nl[[3]], opt_pm_m1[[4]], opt_pm_m2[[4]], opt_pm_m3[[4]])
pretty_pm = function(m1, m2, m3, m4){
  # Merge the individual data frames
  pm_pretty_df = rbind(m1, m2, m3, m4)
  # Format nicely
  pm_pretty_df %>% kable(caption = "Optimal Number of Diffusion Indices (m) and Lags (p) for Different Models", digits = 0) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = "The MV CAViaR model doesn't have an optimal value for p because there are no AR lags in the model"
  )
  
}

#' Here is a function that runs the univariate CAViaR model 4 times
#'
#' @param df - the percent change data frame to consider
#' @param nfcst - number of forecasts to run
#' @param tau - the VaR level to consider
#' @param no_run - specifies if any models should not be run
#'
#' @return - a list of the 4 univariate model forecasts
#' @export
#'
#' @examples - aceg = gen_uv_test(pc_df, 1, 0.05, no_run = c(1,1,0,1))
gen_uv_test = function(df, nfcst, tau, no_run = c(0,0,0,0)){
  # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
  # Initialize a list  
  out_list = list()
  # Run the four models - model 1; SAV
  if (no_run[1] == 0){
    uvcav_1 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 1, G = 10, col = 1, level = tau)
  }
  # Add a filler if there's no entry
  else {
    uvcav_1 = 0
  }
  # Model 2 - AS
  if (no_run[2] == 0){
    uvcav_2 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 2, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_2 = 0
  }
  # Model 3 - GARCH
  if (no_run[3] == 0){
    uvcav_3 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 3, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_3 = 0
  }
  # Model 4 - Adaptive
  if (no_run[4] == 0){
    uvcav_4 = rolling_predictions(df[,1], range_data = (1:length(df[,1])), nfcst = nfcst, model = 4, G = 10, col = 1, level = tau)
  }
  else {
    uvcav_4 = 0
  }
  # Export the data as a list
  return(list(uvcav_1, uvcav_2, uvcav_3, uvcav_4))
}

#' Function to plot the data which we generate in previous functions
#'
#' @param plot_matrix - matrix with the data to plot
#' @param norm_value - what to subtact from the data to make it on a percentage change basis. Default is 100.
#'
#' @return 
#' @export - a plot of the data by diffusion index number
#'
#' @examples = plt_data(plot_mtx[[1]]), abc = plt_data(plot_mat, tau = 0.01)
plt_data = function(plot_matrix, tau, resp_var, ntest){
  # Establish a maximum and minimum value
  max_val = max(plot_matrix[,1:ncol(plot_matrix)])
  min_val = min(plot_matrix[,1:ncol(plot_matrix)])
  # Calculate inital and ending time value
  start = index(plot_matrix)[1]
  end = index(plot_matrix)[nrow(plot_matrix)]
  ind_vals = index(plot_matrix) - start
  # Create an initial plot and add lines
    for (i in 1:ncol(plot_matrix)){
      if (i == 1){
        # 4/2/2020 - fixing the index
        plot.ts(ind_vals,plot_matrix[,i], type = "l", xlab = paste("Days Since", as.Date(start)), ylab = "Percent Change in PG", ylim = c(min_val,max_val), lwd = 1, main = paste("Predicting", resp_var, "Returns from", as.Date(start), "to", as.Date(end)), sub = paste("The VaR Level is ", 100*tau, "%", "; There are ", ntest, " Trading Days Plotted Above", sep = ""))
        # plot.ts(index(plot_matrix), plot_matrix[,i], type = "l", xlab = "Trading Days", ylab = "Percent Change in PG", ylim = c(min_val,max_val), lwd = 1, main = "Predicting PG Returns Over Last 250 Trading Days in 2008", sub = paste("The VaR Level is ", 100*tau, "%", sep = ""))
    } else if(i %in% seq(2,8,1)) {
        lines(ind_vals,plot_matrix[,i], col = i-1, lty = 2)
    } else {
        lines(ind_vals,plot_matrix[,i], col = i-1, lty = 2, lwd = 2)
    }
    }
  # Define a sequence for plotting
  plot_seq = seq(1, ncol(plot_matrix))
  legend("topleft", legend = c(colnames(plot_matrix)), col = plot_seq, lty = c(1, rep(2, 7), rep(3, ifelse(ncol(plot_matrix)-8 <= 0, 0, ncol(plot_matrix)-8))), lwd = c(1, rep(1, 7), rep(2, ifelse(ncol(plot_matrix)-8 <= 0, 0, ncol(plot_matrix)-8))))
  # Add a line for 0
  # abline(h = 0, col = "black", lty = 2)
}


#' A function to calculate losses based on the test sample
#'
#' @param true_vec - the true vector of returns
#' @param pred_vec - the predicted vector from the model runs
#' @param tau - VaR level. Must match what the model used
#'
#' @return - total losses and the entire loss vector
#' @export
#'
#' @examples
loss_test = function(true_vec, pred_vec, tau){
  # Initialize a loss vector
  lvec = rep(0, length(true_vec))
  # Initialize a break vector to see when VaR is broken
  bvec = rep(0, length(true_vec))
  for (i in 1:length(true_vec)){
    # Calculate an indicator variable
    bvec[i] = ifelse(true_vec[i] < pred_vec[i], 1,0)
    # Use indicator in function below
    lvec[i] = (tau - bvec[i])*(true_vec[i] - pred_vec[i])
  }
  # Add up the losses
  # sumloss = sum(lvec)/length(lvec)
  sumloss = sum(lvec)
  # Add up the VaR breakage
  varbreak = sum(bvec)/length(bvec)
  return(list(sumloss,lvec, varbreak, bvec))
}
#' A function to calculate losses based on the plot matrix
#'
#' @param data_mat - a matrix of forecasted VaR values, with the true value in the first column
#' @param tau - VaR level. Must match what the model used
#'
#' @return - a list of four items. 
#' 1 = a vector of the losses of all models. 
#' 2 = a vector showing the percentage of VaR breaks by model
#' 3 = the loss matrix
#' 4 = the break matrix
#' @export
#'
#' @examples
gen_loss_test = function(data_mat, tau){
  # Initialize loss and break matrices
  lmat = bmat = matrix(0, nrow = nrow(data_mat), ncol = ncol(data_mat)-1)
  # bvec = rep(0, length(true_vec))
  # Populate the matrices
  for (i in 1:nrow(lmat)){
    for (j in 1:(ncol(lmat))){
      # Calculate an indicator variable
      bmat[i,j] = ifelse(data_mat[i,1] < data_mat[i,j+1], 1,0)
      # Use indicator in function below
      lmat[i,j] = (tau - bmat[i,j])*(data_mat[i,1] - data_mat[i,j+1])
    }    
  }
  # Add up the losses
  sumloss = colSums(lmat)
  # Add up the VaR breakage
  varbreak = colSums(bmat)/nrow(bmat)
  return(list(sumloss, varbreak, lmat, bmat))
}
#' A function to make a nice comparison of losses
#'
#' @param data_mat - input data matrix used in the calculation of losses
#' @param loss_list - a list of the losses calculated from the CAViaR function
#' @param tau - the risk level used
#' @param ntest - the number of test points
#'
#' @return
#' @export - returns a nicely formatted table
#'
#' @examples - pretty_tables(plot_mat, l_list, tau = 0.01)
pretty_tables = function(data_mat, loss_list, tau, ntest){
  # Combine into a data frame
  df = as.data.frame(rbind(loss_list[[1]], loss_list[[2]]))
  # Calculate inital and ending time value
  start = index(data_mat)[1]
  end = index(data_mat)[nrow(data_mat)]
  # Add row/column names
  colnames(df) <- colnames(data_mat[,-1])
  rownames(df) <- c("Losses", "VaR Breaks (%)")
  # Convert to a table
  df %>% kable(caption = paste("Comparison of VaR Methods for a ", tau*100, "% VaR", sep = ""), digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", ntest, "trading days from", as.Date(start), "to", as.Date(end)))
}
#' A dressed up version of the export function
#'
#' @param var_file - file to export
#' @param path - filepath
#' @param filename - name of the file, ending with .CSV
#'
#' @return
#' @export - exported CSV file
#'
#' @examples - exp_func(var_file = var_1pc_2016_usetf[[1]], path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "TEST.csv")
exp_func = function(var_file, path, filename){
  # Write a zoo
  write.zoo(var_file, paste0(path, filename), quote = FALSE, sep = ",")
}

# exp_func(var_file = var_1pc_2016_usetf[[1]], path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "TEST.csv")

#' This is the "master" function where we'll evaluate the importance of the VaR model over several time periods
#'
#' @param symbol_list - a list of symbols to feed into the model 
#' @param resp_var - the response variable
#' @param compl_case - should the model require complete cases? Default value is 1.
#' @param adj_close - use adjusted close price for the predictors? Default value is 1.
#' @param resp_adj_close - use adjusted close price for the response? Default value is 1.
#' @param start_date - start date to pull data from
#' @param end_date - end date to pull data from
#' @param nval - number of validation points to use
#' @param ntest - number of test points to use
#' @param tau - VaR level to use
#' @param low_m - low number of predictors to test
#' @param high_m  - low number of predictors to test
#' @param uv_list - a list of a pre-run univariate model. If a data frame is not provided, the lengthy uv model will run 
#' @param no_run - things not to run in the model
#' @param low_p - low value for number of lags
#' @param high_p - high value for number of lags
#' @param na_interp - should the function interpolate NA's
#' @param print_mdl - print the model summaries?
#' @param print_mp - print the optimal values for p and m
#' @param lag_pred - do you want to lag the m predictors (default is 1; strongly recommended)
#' @param rowname - what to name the rows of the nice p and m matrix
#' @param export_csv - do you want to export a CSV? Default is 1.
#' @param path - path to export the CSV
#' @param filename - what to name the CSV
#'
#' @return - a list of the plot matrix, a plot, a list with losses, and a table
#' @export - a plot and a table
#'
#' @examples - cav_simul(c("DIS", "GE", "IBM", "MMM", "XOM"), resp_var = "PG", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 5, tau = 0.01, uv_list = uv_cav_list)
cav_simul = function(symbol_list, resp_var, compl_case = 1, adj_close = 1, resp_adj_close = 1, start_date = "1900-01-01", end_date = Sys.Date(), nval, ntest, tau, low_m = 1, high_m, low_p = 1, high_p, uv_list = NULL, no_run = c(0,0,0,0), na_interp = TRUE, print_mdl = 0, print_mp = 0, lag_pred = 1, rowname = NULL, export_csv = 1, path, filename){
  # Select data parameters, pull the data, and percent change the data
  df = diff_index_df(symbol_list = symbol_list, resp_var = resp_var, compl_case = compl_case, adj_close = adj_close, resp_adj_close = resp_adj_close, start_date = start_date, end_date = end_date, lag_pred = lag_pred)
  # Take the percent change of the data
  pc_df = pc_diff_index(df)
  # Extract the legnth of the data frame
  nr = test_end = nrow(pc_df)
  # Calculate the start of the val period, the end of the val period, and the beginning and end of test period
  test_orig = test_end - ntest
  val_end = test_orig
  val_orig = test_orig - nval
  # Test for the optimal number of parameters
  opt_pred_nl = opt_m(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, rowname = rowname)
  opt_pred_art1 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p,mod_di = 1, ar_tf = 1, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  opt_pred_art2 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p,mod_di = 1, ar_tf = 2, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  opt_pred_art3 = opt_mp(y = pc_df[,1], x = pc_df[,-1], orig = val_orig, end = val_end, tau = tau, low_m = low_m, high_m = high_m, low_p = low_p, high_p = high_p, mod_di = 1, ar_tf = 3, print_mdl = print_mdl, print_mp = print_mp, rowname = rowname)
  # gen_uv_test(pc_df, 1, 0.05, no_run = c(1,1,0,1))
  # Use the above forecasts to input into the above
  mv_fcst = mod_di(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_nl[[1]], tau = tau, print_mdl = print_mdl)
  mv_fcst_art1 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art1[[1]], p = opt_pred_art1[[2]], tau = tau, ar_tf = 1, print_mdl = print_mdl)
  mv_fcst_art2 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art2[[1]], p = opt_pred_art2[[2]], tau = tau, ar_tf = 2, print_mdl = print_mdl)
  mv_fcst_art3 = mod_di_wl(pc_df[,1], pc_df[,-1], orig = test_orig, m = opt_pred_art3[[1]], p = opt_pred_art3[[2]], tau = tau, ar_tf = 3, print_mdl = print_mdl)
  # Calculate the number of predictions
  if (is.null(uv_list) == TRUE){
    # Print a warning
    print("WARNING: Not supplying an input data frame will require this function to run for a significant amount of time (1hr+)")
    # Call the function
    # gen_uv_test = function(df, nfcst, tau, no_run = c(0,0,0,0)){
    # print(head(pc_df))
    uv_list = gen_uv_test(df = pc_df, nfcst = ntest, tau = tau, no_run = no_run)
    # Add to a data frame
    # Incorporate the rolling predictions function results here
  plot_mat = cbind(pc_df[(test_orig+1):nrow(pc_df),1], mv_fcst$yhat[1:ntest], mv_fcst_art1$yhat[1:ntest], mv_fcst_art2$yhat[1:ntest], mv_fcst_art3$yhat[1:ntest], uv_list[[1]][(test_orig+1):test_end]*(-1), uv_list[[2]][(test_orig+1):test_end]*(-1), uv_list[[3]][(test_orig+1):test_end]*(-1), uv_list[[4]][(test_orig+1):test_end]*(-1))
  } else {
    # Assign the columns of the data frame
    # head(var_5pc_2010_usetf[[1]][,6:9])
    # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE) 
    # test_df = head(var_5pc_2010_usetf[[1]][,6:9])
    # test_df$SAV
    # test_df$`Abs. Slope`
    # test_df$`Ind. GARCH`
    # test_df$Adaptive
    plot_mat = cbind(pc_df[(test_orig+1):nrow(pc_df),1], mv_fcst$yhat[1:ntest], mv_fcst_art1$yhat[1:ntest], mv_fcst_art2$yhat[1:ntest], mv_fcst_art3$yhat[1:ntest], uv_list$SAV, uv_list$`Abs. Slope`, uv_list$`Ind. GARCH`, uv_list$Adaptive)
  }
  # Count the NAs and print a warning
  print(paste("NOTE: There are ", sum(is.na(plot_mat)), " NA(s) in the dataset", sep = ""))
  # Linearly interpolate the NAs
  if (na_interp == TRUE){
    # Assign the plot matrix to a new value
    plot_mat_na <- plot_mat
    # Print a warning
    print("WARNING: There were missing values in the plot matrix.")
    # Interpolate the NA's
    for (i in 1:ncol(plot_mat_na)){
      # Interpolate the data
      plot_mat[,i] <- na.approx(plot_mat_na[,i])
    }
  }
  # model type (1 - SAV, 2 - AS, 3 - GARCH, 4 - ADAPTIVE)
  # Add descriptive titles onto the plot_mat
  colnames(plot_mat) <- c(resp_var, "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")
  # colnames(plot_mat) <- c("SPY", "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")
  # Plot everything
  plot = plt_data(plot_mat, tau = tau, resp_var = resp_var, ntest = ntest)
  # Calculate losses
  l_list = gen_loss_test(plot_mat, tau = tau)
  # Put into tables
  tables = pretty_tables(plot_mat, l_list, tau = tau, ntest = ntest)
  # Run the function for optimal p and m
  pm_table = pretty_pm(opt_pred_nl[[3]], opt_pred_art1[[4]], opt_pred_art2[[4]], opt_pred_art3[[4]])
  # Export the matrix
  if (export_csv == 1){
    exp_func(var_file = plot_mat, path, filename)
  }
  # Print the tables and the plot
  print(plot)
  print(tables)
  print(pm_table)
  return(list(plot_mat, plot, l_list, tables, plot_mat_na, pm_table))
}
# Import the data from CSV's

# abc = read.csv("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", sep = ",", header = T)
# head(abc)
# as.xts(abc, order.by = abc[,1])

# test1 <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", sep = ",",  index.column =0, header = T)
# dat_zoo <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", index.column=0, sep=",", header = T, format="%m/%d/%Y")
# dat_zoo <- read.zoo("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_usetf.csv", index.column=0, sep=",", header = T, FUN=as.yearmon)
# test1
# dat_xts = as.xts(dat_zoo, order.by = dat_zoo[,1])

# Mess around code - it works!
abc = read.csv("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/var_1pc_2008_us_etf.csv", sep = ",", header = T, stringsAsFactors = FALSE)
abc$Index = as.Date(abc$Index)
# abc$index_t = as.POSIXct(abc$Index, format = "%Y-%m-%d")
# index_t
# head(abc)
abc_x = xts(abc[,-1], order.by = abc[,1])
# head(abc_x)
#' A function to input the VaR files, plot them and generate tables
#'
#' @param file_path - file path to use
#' @param filename - name of the file
#' @param tau - quantile to use
#' @param resp_var - response variable to use in the plot
#' @param ntest - number of test points
#' @param cn_input - column name inputs
#'
#' @return - a list of the xts file, the plot, the loss list, and tables
#' @export - a plot and tables
#'
#' @examples - test = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)
var_input_disp = function(file_path, filename, tau, resp_var = "SPY", ntest = 250, cn_input = c("SPY", "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8")){
# var_input_disp = function(file_path, filename, tau, resp_var = "SPY", ntest = 250, cn_input = c("SPY", "MV CAViaR", "MV CAViaR + AR", "MV CAViaR + SAV", "MV CAViaR + AS", "SAV", "Abs. Slope", "Ind. GARCH", "Adaptive")){
  # Import data
  plot_mat = read.csv(paste0(file_path,filename), sep = ",", header = T, stringsAsFactors = FALSE)
  # Fix date format
  plot_mat$Index = as.Date(plot_mat$Index)
  # Convert to an xts
  plot_mat = xts(plot_mat[,-1], order.by = plot_mat[,1])
  # Fix column names
  colnames(plot_mat) <- cn_input
  # Plot everything
  plot = plt_data(plot_mat, tau = tau, resp_var = resp_var, ntest = ntest)
  # Calculate losses
  l_list = gen_loss_test(plot_mat, tau = tau)
  # Put into tables
  tables = pretty_tables(plot_mat, l_list, tau = tau, ntest = ntest)
  # Print the tables and the plot
  print(plot)
  print(tables)
  # print(pm_table)
  # Return the xts, the plot, the loss list, and the tables
  return(list(plot_mat, plot, l_list, tables))
}
# test = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)
# Create a fake data frame, and assign silly numbers
df_FAKE = as.data.frame(cbind(1,2,3,4))
rownames(df_FAKE) <- c("Numbers")
colnames(df_FAKE) <- c("One", "Two", "Three", "Four")
df_FAKE %>% kable(caption = "Fake Data", digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", 4, "fake data points"))

# df %>% kable(caption = paste("Comparison of VaR Methods for a ", tau*100, "% VaR", sep = ""), digits = 3) %>% kable_styling("striped", full_width = F) %>% kable_styling() %>% footnote(general = paste("Calculated using", ntest, "trading days from", as.Date(start), "to", as.Date(end)))
# return(list(plot_mat, plot, l_list, tables))

# Call the above function
v1_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2008_us_etf.csv", 0.01)
pretty_tables(v1_2008_usetf[[1]], v1_2008_usetf[[3]], tau = 0.01, ntest = 250)
v5_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2008_us_etf.csv", 0.05)
v10_2008_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2008_us_etf.csv", 0.10)

# head(v10_2008_usetf[[1]])
v10_2008_usetf
# 1%, 5%, 10% VaR - 2008 - 1st set of predictors
# var_1pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2008_us_etf.csv", uv_list = var_1pc_2008_usetf[[1]])

# var_5pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2008_us_etf.csv", uv_list = var_5pc_2008_usetf[[1]])

# var_10pc_2008_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2008_us_etf.csv", uv_list = var_10pc_2008_usetf[[1]])
# Call the above function
v1_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2008_glob_etf.csv", 0.01)
v5_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2008_glob_etf.csv", 0.05)
v10_2008_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2008_glob_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2008 - 2nd set of predictors
# var_1pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2008_glob_etf.csv", uv_list = var_1pc_2008_usetf[[1]])

# var_5pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2008_glob_etf.csv", uv_list = var_5pc_2008_usetf[[1]])

# var_10pc_2008_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2008_glob_etf.csv", uv_list = var_10pc_2008_usetf[[1]])
# 1%, 5%, 10% VaR - 2008 - 3rd set of predictors
# var_1pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2008_comm_etf.csv", uv_list = var_1pc_2008_usetf[[1]])

# var_5pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2008_comm_etf.csv", uv_list = var_5pc_2008_usetf[[1]])

# var_10pc_2008_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2008_comm_etf.csv", uv_list = var_10pc_2008_usetf[[1]])
# Call the above function
v1_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2008_bond_etf.csv", 0.01)
v5_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2008_bond_etf.csv", 0.05)
v10_2008_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2008_bond_etf.csv", 0.10)
# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

# 1%, 5%, 10% VaR - 2008 - 4th set of predictors
# var_1pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2008_bond_etf.csv", uv_list = var_1pc_2008_usetf[[1]])

# var_5pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2008_bond_etf.csv", uv_list = var_5pc_2008_usetf[[1]])

# var_10pc_2008_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2008_bond_etf.csv", uv_list = var_10pc_2008_usetf[[1]])
# Call the above function
v1_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2008_all_etf.csv", 0.01)
v5_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2008_all_etf.csv", 0.05)
v10_2008_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2008_all_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2008 - 5th set of predictors
# var_1pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2008_all_etf.csv", uv_list = var_1pc_2008_usetf[[1]])

# var_5pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2008_all_etf.csv", uv_list = var_5pc_2008_usetf[[1]])

# var_10pc_2008_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2004-01-01", end_date = "2008-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2008_all_etf.csv", uv_list = var_10pc_2008_usetf[[1]])
# Call the above function
v1_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2010_us_etf.csv", 0.01)
v5_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2010_us_etf.csv", 0.05)
v10_2010_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2010_us_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2010 - 1st set of predictors
# var_1pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2010_us_etf.csv", uv_list = var_1pc_2010_usetf[[1]])

# var_5pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2010_us_etf.csv", uv_list = var_5pc_2010_usetf[[1]])

# var_10pc_2010_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2010_us_etf.csv", uv_list = var_10pc_2010_usetf[[1]])
# Call the above function
v1_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2010_glob_etf.csv", 0.01)
v5_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2010_glob_etf.csv", 0.05)
v10_2010_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2010_glob_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2010 - 2nd set of predictors
# var_1pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2010_glob_etf.csv", uv_list = var_1pc_2010_usetf[[1]])

# var_5pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2010_glob_etf.csv", uv_list = var_5pc_2010_usetf[[1]])

# var_10pc_2010_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2010_glob_etf.csv", uv_list = var_10pc_2010_usetf[[1]])
# 1%, 5%, 10% VaR - 2010 - 3rd set of predictors
# var_1pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2010_comm_etf.csv", uv_list = var_1pc_2010_usetf[[1]])

# var_5pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2010_comm_etf.csv", uv_list = var_5pc_2010_usetf[[1]])

# var_10pc_2010_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2010_comm_etf.csv", uv_list = var_10pc_2010_usetf[[1]])
# Call the above function
v1_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2010_bond_etf.csv", 0.01)
v5_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2010_bond_etf.csv", 0.05)
v10_2010_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2010_bond_etf.csv", 0.10)
# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

# 1%, 5%, 10% VaR - 2010 - 4th set of predictors
# var_1pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2010_bond_etf.csv", uv_list = var_1pc_2010_usetf[[1]])

# var_5pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2010_bond_etf.csv", uv_list = var_5pc_2010_usetf[[1]])

# var_10pc_2010_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2010_bond_etf.csv", uv_list = var_10pc_2010_usetf[[1]])
# Call the above function
v1_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2010_all_etf.csv", 0.01)
v5_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2010_all_etf.csv", 0.05)
v10_2010_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2010_all_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2010 - 5th set of predictors
# var_1pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2010_all_etf.csv", uv_list = var_1pc_2010_usetf[[1]])

# var_5pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2010_all_etf.csv", uv_list = var_5pc_2010_usetf[[1]])

# var_10pc_2010_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2006-01-01", end_date = "2010-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2010_all_etf.csv", uv_list = var_10pc_2010_usetf[[1]])
# Call the above function
v1_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2014_us_etf.csv", 0.01)
v5_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2014_us_etf.csv", 0.05)
v10_2014_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2014_us_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2014 - 1st set of predictors
# var_1pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2014_us_etf.csv", uv_list = var_1pc_2014_usetf[[1]])

# var_5pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2014_us_etf.csv", uv_list = var_5pc_2014_usetf[[1]])

# var_10pc_2014_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2014_us_etf.csv", uv_list = var_10pc_2014_usetf[[1]])
# Call the above function
v1_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2014_glob_etf.csv", 0.01)
v5_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2014_glob_etf.csv", 0.05)
v10_2014_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2014_glob_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2014 - 2nd set of predictors
# var_1pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2014_glob_etf.csv", uv_list = var_1pc_2014_usetf[[1]])

# var_5pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2014_glob_etf.csv", uv_list = var_5pc_2014_usetf[[1]])

# var_10pc_2014_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2014_glob_etf.csv", uv_list = var_10pc_2014_usetf[[1]])
# 1%, 5%, 10% VaR - 2014 - 3rd set of predictors
# var_1pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2014_comm_etf.csv", uv_list = var_1pc_2014_usetf[[1]])

# var_5pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2014_comm_etf.csv", uv_list = var_5pc_2014_usetf[[1]])

# var_10pc_2014_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2014_comm_etf.csv", uv_list = var_10pc_2014_usetf[[1]])
# Call the above function
v1_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2014_bond_etf.csv", 0.01)
v5_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2014_bond_etf.csv", 0.05)
v10_2014_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2014_bond_etf.csv", 0.10)
# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

# 1%, 5%, 10% VaR - 2014 - 4th set of predictors
# var_1pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2014_bond_etf.csv", uv_list = var_1pc_2014_usetf[[1]])

# var_5pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2014_bond_etf.csv", uv_list = var_5pc_2014_usetf[[1]])

# var_10pc_2014_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2014_bond_etf.csv", uv_list = var_10pc_2014_usetf[[1]])
# Call the above function
v1_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2014_all_etf.csv", 0.01)
v5_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2014_all_etf.csv", 0.05)
v10_2014_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2014_all_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2014 - 5th set of predictors
# var_1pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2014_all_etf.csv", uv_list = var_1pc_2014_usetf[[1]])

# var_5pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2014_all_etf.csv", uv_list = var_5pc_2014_usetf[[1]])

# var_10pc_2014_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2010-01-01", end_date = "2014-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2014_all_etf.csv", uv_list = var_10pc_2014_usetf[[1]])
# Call the above function
v1_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_1pc_2016_us_etf.csv", 0.01)
v5_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_5pc_2016_us_etf.csv", 0.05)
v10_2016_usetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/","var_10pc_2016_us_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2016 - 1st set of predictors
# var_1pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_1pc_2016_us_etf.csv", uv_list = var_1pc_2016_usetf[[1]])

# var_5pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_5pc_2016_us_etf.csv", uv_list = var_5pc_2016_usetf[[1]])

# var_10pc_2016_us_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 9, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_US_ETF_runs/", filename = "var_10pc_2016_us_etf.csv", uv_list = var_10pc_2016_usetf[[1]])
# Call the above function
v1_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_1pc_2016_glob_etf.csv", 0.01)
v5_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_5pc_2016_glob_etf.csv", 0.05)
v10_2016_globetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/","var_10pc_2016_glob_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2016 - 2nd set of predictors
# var_1pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_1pc_2016_glob_etf.csv", uv_list = var_1pc_2016_usetf[[1]])

# var_5pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_5pc_2016_glob_etf.csv", uv_list = var_5pc_2016_usetf[[1]])

# var_10pc_2016_glob_etf = cav_simul(c("JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 10, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_glob_ETF_runs/", filename = "var_10pc_2016_glob_etf.csv", uv_list = var_10pc_2016_usetf[[1]])
# 1%, 5%, 10% VaR - 2016 - 3rd set of predictors
# var_1pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_1pc_2016_comm_etf.csv", uv_list = var_1pc_2016_usetf[[1]])

# var_5pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_5pc_2016_comm_etf.csv", uv_list = var_5pc_2016_usetf[[1]])

# var_10pc_2016_comm_etf = cav_simul(c("DBA", "DBC", "DBE", "DBB"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_comm_ETF_runs/", filename = "var_10pc_2016_comm_etf.csv", uv_list = var_10pc_2016_usetf[[1]])
# Call the above function
v1_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_1pc_2016_bond_etf.csv", 0.01)
v5_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_5pc_2016_bond_etf.csv", 0.05)
v10_2016_bondetf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/","var_10pc_2016_bond_etf.csv", 0.10)
# iShares 1-3 Year Treasury Bond Fund (SHY)
# iShares 7-10 Year Treasury Bond Fund (IEF)
# iShares 20+ Year Treasury Bond Fund (TLT)
# iShares iBoxx $ Investment Grade Corporate Bond ETF (LQD)

# 1%, 5%, 10% VaR - 2016 - 4th set of predictors
# var_1pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_1pc_2016_bond_etf.csv", uv_list = var_1pc_2016_usetf[[1]])

# var_5pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_5pc_2016_bond_etf.csv", uv_list = var_5pc_2016_usetf[[1]])

# var_10pc_2016_bond_etf = cav_simul(c("SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 4, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_bond_ETF_runs/", filename = "var_10pc_2016_bond_etf.csv", uv_list = var_10pc_2016_usetf[[1]])
# Call the above function
v1_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_1pc_2016_all_etf.csv", 0.01)
v5_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_5pc_2016_all_etf.csv", 0.05)
v10_2016_alletf = var_input_disp("/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/","var_10pc_2016_all_etf.csv", 0.10)
# 1%, 5%, 10% VaR - 2016 - 5th set of predictors
# var_1pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10, tau = 0.01, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_1pc_2016_all_etf.csv", uv_list = var_1pc_2016_usetf[[1]])

# var_5pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.05, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_5pc_2016_all_etf.csv", uv_list = var_5pc_2016_usetf[[1]])

# var_10pc_2016_all_etf = cav_simul(c("XLU", "XLP", "XLV", "XLK", "XLY", "XLI", "XLF", "XLB", "XLE", "JXI", "KXI", "IXJ", "IXP", "IXN", "RXI", "EXI", "IXG", "MXI", "IXC", "SHY", "IEF", "TLT", "LQD"), resp_var = "SPY", start_date = "2012-01-01", end_date = "2016-12-31", nval = 250, ntest = 250, low_m = 1, high_m = 23, low_p = 1, high_p = 10,tau = 0.10, print_mdl = 1, print_mp = 1, path = "/Users/stevenmoen/Documents/GitHub/CAViaR_MS_thesis/Data_Export/SPY_all_ETF_runs/", filename = "var_10pc_2016_all_etf.csv", uv_list = var_10pc_2016_usetf[[1]])

Literature Cited

LS0tCnRpdGxlOiAiTXVsdGl2YXJpYXRlIENBVmlhUiIKc3VidGl0bGU6ICJBIE5ldyBBcHByb2FjaCB0byBSaXNrIE1vZGVsaW5nIgphdXRob3I6ICJTdGV2ZW4gTW9lbiIKZGF0ZTogIlRodXJzZGF5LCBBcHJpbCAzMHRoLCAyMDIwIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIGZpZy5wYXRoPSdGaWdzLycsCiAgICAgICAgICAgICAgICAgICAgICBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZSA9IFRSVUUpCmBgYAoKIyBBYnN0cmFjdAoKVGhpcyBwYXBlciBidWlsZHMgdXBvbiBwcmV2aW91cyBsaXRlcmF0dXJlIGZvciBtb2RlbGluZyB2YWx1ZS1hdC1yaXNrIHF1YW50aWxlcyB0aGF0IHVzZXMgYW4gQVJNQS1zdHlsZSBhcHByb2FjaCBieSBhZGRpbmcgRVRGcyBhcyBleHBsYW5hdG9yeSB2YXJpYWJsZXMgdGhhdCBhcmUgY29tYmluZWQgaW50byBwcmluY2lwYWwgY29tcG9uZW50IHZlY3RvcnMgYXQgdGhlIGZvcmVjYXN0IG9yaWdpbi4gQnkgY29tYmluaW5nIHRoZXNlIHByaW5jaXBhbCBjb21wb25lbnQgdmVjdG9ycyBhbG9uZyB3aXRoIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIG9mIGxhZ2dlZCBhdXRvcmVncmVzc2l2ZSByZXNwb25zZSB2YXJpYWJsZXMsIHNpbWlsYXIgcHJlZGljdGl2ZSBhY2N1cmFjeSBpcyBhY2hpZXZlZCAocmVsYXRpdmUgdG8gdGhlIHVuaXZhcmlhdGUgbW9kZWwpIGFuZCBhIGNsZWFyZXIgaW50ZXJwcmV0YXRpb24gaXMgZ2FpbmVkLiBJbiBmYWN0LCB0aGlzIHRoZXNpcyBwcm9wb3NlcyBhbiBhbGdvcml0aG0gdG8gZGV0ZWN0IGNoYW5nZXBvaW50cyBpbiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzIHRoYXQgY291bGQgYmUgdXNlZCBhcyBhIG1lYW5zIHRvIG1lYXN1cmUgY2hhbmdlcG9pbnRzIGluIHRoZSBlY29ub215LiBbREVMRVRFIElGIFRIRSBDSEFOR0VQT0lOVCBBUkdVTUVOVCBET0VTTidUIE1BS0UgU0VOU0UuXQoKIyBCYWNrZ3JvdW5kIGFuZCBJbnRyb2R1Y3Rpb24KCldoZW4gbW9kZWxpbmcgZmluYW5jaWFsIHRpbWUgc2VyaWVzLCBzaW1wbHkgY29uc2lkZXJpbmcgdGhlIG1lYW4gYW5kIHRoZSB2YXJpYW5jZSBpcyBpbnN1ZmZpY2llbnQuIEluIGZhY3QsIG1vZGVsaW5nIGEgMSUgb3IgYSA1JSBxdWFudGlsZSBvZiBkYWlseSByZXR1cm5zIGlzIGEgd2F5IHRvIHVuZGVyc3RhbmQgd2hhdCBoYXBwZW5zIG9uIHRoZSB3b3JzdCBkYXlzIGFuZCB0byBoYXZlIGEgY2xlYXJlciBwaWN0dXJlIG9mIHdoYXQgbWlnaHQgaGFwcGVuIGR1cmluZyBhIGRvd250dXJuLiBJbmRlZWQsIGZpbmFuY2UgdGhlb3J5IHN1Z2dlc3RzIHRoYXQgdGhlIHJlYXNvbnMgd2h5IHN0b2NrcyBlYXJuIGEgeCUgcmVhbCByZXR1cm4gKENJVEUpIGFmdGVyIHRheGVzIGFuZCBpbmZsYXRpb24gb3ZlciB2ZXJ5IGxvbmcgcGVyaW9kcyBvZiB0aW1lIGlzIGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBtaWdodCBiZSBhIHNpZ25pZmljYW50IGRvd250dXJuIGluIGFzc2V0IHByaWNlcy4gCgpPbmUgd2F5IHRvIHVuZGVyc3RhbmQgZG93bnNpZGUgcmlzayBpcyB1c2luZyB2YWx1ZS1hdC1yaXNrIChWYVIpOyBhIG9uZS1kYXkgMSUgVmFSIG9mIC0xIG1pbGxpb24gZG9sbGFycyBmb3IgYSBwb3J0Zm9saW8gbWVhbnMgdGhhdCB0aGUgcG9ydGZvbGlvIHdpbGwgbG9zZSBhdCBsZWFzdCAkMSBtaWxsaW9uIG9uIHRoZSAxJSB3b3JzdCB0cmFkaW5nIGRheXMuIEEgbWFqb3IgYWR2YW50YWdlIG9mIFZhUiBpcyB0aGF0IGl0IGRpc3RpbGxzIGEgZGlzdHJpYnV0aW9uIG9mIHJldHVybnMgaW50byBvbmUgbnVtYmVyLiBBcyBzdWNoLCBWYVIgaXMgb2Z0ZW4gdXNlZCBpbiBzdHJlc3MgdGVzdGluZyBieSByZWd1bGF0b3J5IGFnZW5jaWVzIChDSVRFPykuCgpNYW55IG9mIHRoZSBhcHByb2FjaGVzIGZvciBtb2RlbGluZyBWYVIgcmVseSBvbiBhIHNlbWlwYXJhbWV0cmljIG9yIGEgbm9ucGFyYW1ldHJpYyBoaXN0b3JpY2FsIHNpbXVsYXRpb24xLiBBY2NvcmRpbmcgdG8gUm9iZXJ0IEVuZ2xlIGFuZCBTaW1vbmUgTWFuZ2FuZWxsaSBpbiBhIDIwMDQgcGFwZXIsIHRoZXNlIG1ldGhvZHMgYXJlIHVzdWFsbHkgY2hvc2VuIGZvciDigJxlbXBpcmljYWwganVzdGlmaWNhdGlvbnMgcmF0aGVyIHRoYW4gb24gc291bmQgc3RhdGlzdGljYWwgdGhlb3J54oCdMi4gQXMgc3VjaCwgdGhleSBwcm9wb3NlIGEgZnJhbWV3b3JrIGNhbGxlZCBDQVZpYVIgdGhhdCBmb3JlY2FzdHMgdGhlIFZhUiBxdWFudGlsZSBkaXJlY3RseSB1c2luZyBhIGNvbmRpdGlvbmFsIGF1dG9yZWdyZXNzaXZlIHF1YW50aWxlIHNwZWNpZmljYXRpb24uIFRoaXMgYXBwcm9hY2ggYnVpbGRzIHVwb24gdGhlIHN0YXRpc3RpY2FsIGxpdGVyYXR1cmUgdGhhdCBleHRlbmRzIGxpbmVhciBxdWFudGlsZSBtb2RlbHMgdG8gc2V0dGluZ3MgYW1lbmFibGUgdG8gZmluYW5jaWFsIG1vZGVsaW5nLCBzdWNoIGFzIHdpdGggaGV0ZXJvc2tlZGFzdGljIGFuZCBub25zdGF0aW9uYXJ5IGVycm9yIGRpc3RyaWJ1dGlvbnMzLDQuCgpNeSBhbmFseXNpcyBvZiB0aGlzIG1vZGVsIHNob3dzIHRoYXQgaXQgcGVyZm9ybWVkIHdlbGwgb24gdGhlIHRlc3Qgc2FtcGxlIOKAkyB0aGUgbGFzdCAyMDAgdHJhZGluZyBkYXlzIG9mIDIwMDgg4oCTIGZvciBhIHN0b2NrIGxpa2UgQW1hem9uIHRoYXQgd2FzIGhpZ2hseSB2b2xhdGlsZSBkdXJpbmcgdGhlIHRyYWluaW5nIHNhbXBsZSwgd2hpY2ggaW5jbHVkZWQgZGF0YSBmcm9tIHByZXZpb3VzIHllYXJzLiBIb3dldmVyLCB0aGUgZm9yZWNhc3QgcGVyZm9ybXMgcG9vcmx5IGZvciBhIHN0b2NrIGxpa2UgUHJvY3RvciAmIEdhbWJsZSAoUEcpIHRoYXQgd2FzIGxlc3Mgdm9sYXRpbGUgZHVyaW5nIHRoZSB0cmFpbmluZyBzYW1wbGUuIEJvdGggc3RvY2tzIHdlcmUgaGlnaGx5IHZvbGF0aWxlIGR1cmluZyB0aGUgbGF0ZSBzdGFnZXMgb2YgMjAwOCwgYnV0IGJlY2F1c2Ugb2YgdGhlIG5vbi1yZXByZXNlbnRhdGl2ZSB0cmFpbmluZyBzYW1wbGUgZm9yIFBHLCB0aGUgbW9kZWwgc2lnbmlmaWNhbnRseSB1bmRlcmVzdGltYXRlZCB0aGUgcmlza2luZXNzIG9mIFBHLiBUaGVyZWZvcmUsIEkgcHJvcG9zZSBkZXZlbG9waW5nIGEgbW9kZWwgdGhhdCBjb21iaW5lcyBzdG9ja3MgaW50byBhIG11bHRpdmFyaWF0ZSBzZXR0aW5nIHRvIGNhcHR1cmUgY29ycmVsYXRpb25zIHRvIGltcHJvdmUgZm9yZWNhc3QgYWNjdXJhY3kuIEkgd2FudCB0byBleHRlbmQgYSBkaWZmdXNpb24gaW5kZXggbW9kZWwsIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFN0b2NrIGFuZCBXYXRzb24gZm9yIHByZWRpY3RpbmcgY29uZGl0aW9uYWwgbWVhbnMsIHRvIHRoZSBkb21haW4gb2YgYSBxdWFudGlsZSByZWdyZXNzaW9uIHRvIGZvcmVjYXN0IFZhUjUsNi4gSW5pdGlhbCB3b3JrIHRoYXQgSSBoYXZlIGRvbmUgc2hvd3MgdGhlIGRpZmZ1c2lvbiBpbmRleCBtb2RlbCBpcyB1c2VmdWwgaW4gcHJlZGljdGluZyB0aGUgbWVhbiByZXR1cm5zIG9mIHRoZSBTUFkgdXNpbmcgVS5TLiBzZWN0b3IgRVRGcyBhcyBwcmVkaWN0b3JzLiBGb3IgdGhpcyByZWFzb24sIEkgc3VzcGVjdCB0aGF0IHVzaW5nIHBvcnRmb2xpbyBjb21wb25lbnRzIGluIHRoZSBzYW1lIGZhc2hpb24gdG8gcHJlZGljdCBhIHNwZWNpZmljIHF1YW50aWxlIHdpbGwgYmUgdXNlZnVsIGFzIHdlbGwsIGFuZCBJIHBsYW4gdG8gZGV2ZWxvcCB0aGVvcmV0aWNhbCBndWFyYW50ZWVzIGFib3V0IHRoZSBkaXN0cmlidXRpb24gb2YgcGFyYW1ldGVycyBpbiB0aGlzIHNldHRpbmcuIEkgaG9wZSB0byBjb25jbHVkZSB0aGlzIHdvcmsgd2l0aGluIG15IGZpcnN0IHllYXIgaW4gdGhlIFBoLkQuIHByb2dyYW0uCgoKCiMgTWV0aG9kcyBVc2VkCgpGaWxsIGluLgoKIyBEYXRhIFVzZWQKClRoZSByZXNwb25zZSB2YXJpYWJsZSB1c2VkIGluIHRoaXMgYW5hbHlzaXMgaXMgU1BZLCB3aGljaCBpcyBhbiBleGNoYW5nZS10cmFkZWQgZnVuZCB0aGF0IGFpbXMgdG8gdHJhY2sgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSA1MDAgbGFyZ2VzdCBtYXJrZXQtY2FwaXRhbGl6YXRpb24gc3RvY2tzIGluIHRoZSBVbml0ZWQgU3RhdGVzIChDSVRFKS4gSXQgaXMgYnJvYWRseSB1c2VkIGFzIGEgYmVsbHdlYXRoZXIgb2YgdGhlIFUuUy4gZWNvbm9teSAoQ0lURSksIGFuZCBoYXMgdGhlIGFkdmFudGFnZSBvZiBhdm9pZGluZyBzdXJ2aXZvcnNoaXAgYmlhcyAtIHdoaWxlIGFuIGluZGl2aWR1YWwgc3RvY2sgbWlnaHQgZ28gYmFua3J1cHQgb3IgbWVyZ2Ugd2l0aCBhbm90aGVyLCBpdCdzIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoYXQgdGhlc2UgaXNzdWVzIGRvIG5vdCBhcHBseSB3aXRoIGFuIEVURi4gCgpGb2xsb3dpbmcgdGhpcyBsb2dpYywgdGhlcmUgYXJlIHNldmVyYWwgY2xhc3NlcyBvZiByZXNwb25zZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIGFuYWx5c2lzLiBUaGUgZmlyc3QgZ3JvdXAgaXMgYSBzZXQgb2YgVS5TLiBzZWN0b3IgRVRGcyBvYnRhaW5lZCBmcm9tIFNlZWtpbmcgQWxwaGEgdXNpbmcgdGhlIGxpbmsgYmVsb3cuIEFzIHdpdGggdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCB0aGVzZSBFVEZzIHdlcmUgcHVibGljbHkgdHJhZGVkIHRocm91Z2hvdXQgdGhlIEdyZWF0IFJlY2Vzc3Npb24uCgpodHRwczovL3NlZWtpbmdhbHBoYS5jb20vZXRmcy1hbmQtZnVuZHMvZXRmLXRhYmxlcy9zZWN0b3JzCgphLiBVdGlsaXRpZXMgKFhMVSkKYi4gQ29uc3VtZXIgU3RhcGxlcyAoWExQKQpjLiBIZWFsdGhjYXJlIChYTFYpCmQuIFRlY2hub2xvZ3kgKFhMSykKZS4gQ29uc3VtZXIgRGlzY3JldGlvbmFyeSAoWExZKQpmLiBJbmR1c3RyaWFsIChYTEkpCmcuIEZpbmFuY2lhbCBTZXJ2aWNlcyAoWExGKQpoLiBCYXNpYyBNYXRlcmlhbHMgKFhMQikKaS4gRW5lcmd5IChYTEUpCgpUaGUgc2Vjb25kIGlzIEdsb2JhbCBTZWN0b3IgRVRGcywgYWxzbyBvYnRhaW5lZCBmcm9tIFNlZWtpbmcgQWxwaGEuIFRoZSByYXRpb25hbGUgZm9yIGluY2x1ZGluZyB0aGVzZSBpcyB0aGF0IHBlcmhhcHMgc29tZSBnbG9iYWwgZXhwb3N1cmUgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJyb2FkZXIgbWFya2V0LgoKYS4gVXRpbGl0aWVzIChKWEkpCmIuIENvbnN1bWVyIFN0YXBsZXMgKEtYSSkKYy4gSGVhbHRoY2FyZSAoSVhKKQpkLiBUZWxlY29tbXVuaWNhdGlvbnMgKElYUCkKZS4gVGVjaG5vbG9neSAoSVhOKQpmLiBDb25zdW1lciBEaXNjcmV0aW9uYXJ5IChSWEkpCmcuIEluZHVzdHJpYWwgKEVYSSkKaC4gRmluYW5jaWFsIFNlcnZpY2VzIChJWEcpCmkuIEJhc2ljIE1hdGVyaWFscyAoTVhJKQpqLiBFbmVyZ3kgKElYQykKClRoZSB0aGlyZCBpcyBib25kIEVURnMsIGFsc28gb2J0YWluZWQgZnJvbSBbQ0lURV0uIExpa2UgdGhlIHByZXZpb3VzIHR3bywgdGhlc2UgRVRGcyBwb3RlbnRpYWxseSBjb250YWluIGZvcndhcmQtbG9va2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RvY2sgbWFya2V0LiBMaW5rIGJlbG93OgoKYS4gaVNoYXJlcyAxLTMgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKFNIWSkKYi4gaVNoYXJlcyA3LTEwIFllYXIgVHJlYXN1cnkgQm9uZCBGdW5kIChJRUYpCmMuIGlTaGFyZXMgMjArIFllYXIgVHJlYXN1cnkgQm9uZCBGdW5kIChUTFQpCmQuIGlTaGFyZXMgaUJveHggJCBJbnZlc3RtZW50IEdyYWRlIENvcnBvcmF0ZSBCb25kIEVURiAoTFFEKQoKTGFzdGx5LCBhbGwgb2YgdGhlIGFib3ZlIGFyZSBydW4gdG9nZXRoZXIuCgojIFJlc3VsdHMKCiMgQ09ERQoKIyMgTGlicmFyaWVzCgpgYGB7cn0KIyBSZWFkIGluIHJlbGV2YW50IGxpYnJhcmllcwpsaWJyYXJ5KG1pY3JvYmVuY2htYXJrKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkocXVhbnRtb2QpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KHpvbykKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShkcGx5cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpsaWJyYXJ5KHF1YW50cmVnKQpsaWJyYXJ5KE1UUykKbGlicmFyeShwbG90M0QpCmxpYnJhcnkoY2l0cikKCiMgU2V0IHVwIHdvcmtpbmcgZGlyZWN0b3J5CiMgc2V0d2QoIn4vRG9jdW1lbnRzL0dpdEh1Yi9DYXZpYVIiKQoKIyBzb3VyY2UoJ2Nhdmlhcl9TTS5SJykKc291cmNlKCd+L0RvY3VtZW50cy9HaXRIdWIvQ2F2aWFSL2Nhdmlhcl9TTS5SJykKYGBgCgpgYGB7cn0KIyBUaGlzIGNvZGUgYmVsb3cgaXMgZm9yIHVzZSBpbiB0aGUgQ0FWaWFSIHNlY3Rpb25zLgpgYGAKCmBgYHtyfQojIEhlcmUgaXMgY29kZSB0aGF0IEknbGwgd3JhcCBzb21lIHBhcnRzIGluIHRvIGF2b2lkIHN1cGVyZmx1b3VzIG91dHB1dApxdWlldCA8LSBmdW5jdGlvbih4KSB7IAogIHNpbmsodGVtcGZpbGUoKSkgCiAgb24uZXhpdChzaW5rKCkpIAogIGludmlzaWJsZShmb3JjZSh4KSkgCn0gCmBgYAoKIyMgVW5pdmFyaWF0ZSBDQVZpYVIgU2VjdGlvbgoKYGBge3J9CiMnIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCBwdWxscyBkYXRhIGZvciB1c2UgaW4gdGhlIENBVmlhUiBtb2RlbAojJwojJyBAcGFyYW0gc3ltYm9sIC0gc3ltYm9sIHRvIHB1bGwKIycgQHBhcmFtIGNvbXBsX2Nhc2UgLSBkZWZhdWx0cyB0byB0cnVlLi4ub25seSBpbmNsdWRlcyBjb21wbGV0ZSBjYXNlcyBpbiB0aGUgZGF0YQojJyBAcGFyYW0gYWRqX2Nsb3NlIC0gdXNlIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzLiBEZWZhdWx0IGlzIHllcy4KIycgQHBhcmFtIGxvZ19yZXR1cm4gLSB1c2UgbG9nIHJldHVybj8gRGVmYXVsdCBpcyB5ZXMuCiMnCiMnIEByZXR1cm4gLSBhIGRhdGEgZnJhbWUgd2hpY2ggY2FuIGJlIGZlZCBpbnRvIGxhdGVyIGZ1bmN0aW9ucwojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIGRhdGFfcHVsbCgiU1BZIikKZGF0YV9wdWxsID0gZnVuY3Rpb24oc3ltYm9sLCBjb21wbF9jYXNlID0gMSwgYWRqX2Nsb3NlID0gMSwgbG9nX3JldHVybiA9IDEsIHN0YXJ0X2RhdGUgPSAiMTkwMC0wMS0wMSIsIGVuZF9kYXRlID0gU3lzLkRhdGUoKSl7CiAgIyBQdWxsIGluIGRhdGEgZnJvbSBxdWFudG1vZAogIHJlc3BvbnNlX3B1bGwgPSBnZXRTeW1ib2xzKHN5bWJvbCwgYXV0by5hc3NpZ24gPSBGQUxTRSwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCiAgIyBHZXQgYWRqdXN0ZWQgY2xvc2luZyBwcmljZQogIGlmIChhZGpfY2xvc2UgPT0gVFJVRSl7CiAgICBkZiA9IEFkKHJlc3BvbnNlX3B1bGwpCiAgfSBlbHNlIHsKICAgIGRmID0gQ2wocmVzcG9uc2VfcHVsbCkKICB9CiAgIyBSZXR1cm4gY29tcGxldGUgY2FzZXMgb25seSAKICBpZiAoY29tcGxfY2FzZSA9PSBUUlVFKXsKICAgIGRmID0gZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdCiAgfSBlbHNlewogICAgZGYgPSBkZgogIH0KICAjIENhbGN1bGF0ZSBsb2cgcmV0dXJuIG9mIGRhdGEKICBpZiAobG9nX3JldHVybiA9PSBUUlVFKXsKICAgIGxyID0gbG9nKGRmWywxXS9zaGlmdChkZlssMV0sIDEsIHR5cGUgPSAibGFnIikpCiAgICAjIENvbWJpbmUgZGF0YQogICAgZGZfb3V0ID0gY2JpbmQoZGYsIGxyKQogICAgIyBSZW5hbWUgdGhlIGRhdGEgCiAgICBjb2xuYW1lcyhkZl9vdXQpIDwtIGMoc3ltPXN5bWJvbCwgcGFzdGUwKHN5bWJvbCwgIl9sb2dfcmV0dXJuIikpCiAgfSBlbHNlewogICAgZGZfb3V0ID0gZGYKICB9CiAgIyBSZXR1cm4gZGF0YQogIHJldHVybihkZl9vdXQpCn0KCgpgYGAKCmBgYHtyfQojJyBQdWxsIHRoZSBkYXRhIGFuZCBydW4gdGhlIENBVmlhUiBmdW5jdGlvbiBvbiBpdAojJwojJyBAcGFyYW0gaW5wdXRfZGF0YSAtIGRhdGEgdG8gdXNlIGluIHRoZSBmdW5jdGlvbgojJyBAcGFyYW0gcmFuZ2VfZGF0YSAtIHJhbmdlIG9mIHRoZSBkYXRhIHRvIHVzZQojJwojJyBAcmV0dXJuIC0gYSBsaXN0IG9mIHZhbHVlcyBmcm9tIHRoZSBjYXZpYXIgZnVuY3Rpb24KIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBjYXZpYXJfcHVsbChzcHkpCmNhdmlhcl9wdWxsID0gZnVuY3Rpb24oaW5wdXRfZGF0YSwgcmFuZ2VfZGF0YSA9ICgyOmRpbShpbnB1dF9kYXRhKVsxXSkpewogICMgUnVuIHRoZSBjYXZpYXIgZGF0YQogIGNhdmlhciA8LSBjYXZpYXJPcHRpbShpbnB1dF9kYXRhW3JhbmdlX2RhdGEsMl0pCiAgcmV0dXJuKGNhdmlhcikKfQoKYGBgCgoKYGBge3J9CiMnIEZ1bmN0aW9uIGZvciBwcm9kdWNpbmcgcm9sbGluZyBwcmVkaWN0aW9ucwojJyBNb2RlbCAxID0gU3ltbWV0cmljIEFic29sdXRlIFZhbHVlLCAyID0gQXN5bW1ldHJpYyBzbG9wZSwgMyA9IEluZGlyZWN0IEdBUkNILCA0ID0gQWRhcHRpdmUKIycKIycgQHBhcmFtIGlucHV0X2RhdGEgLSBpbnB1dCBkYXRhIGZyb20gdGhlIHByZXZpb3VzIGZ1bmN0aW9uCiMnIEBwYXJhbSByYW5nZV9kYXRhIC0gcmFuZ2Ugb2YgdGhlIGRhdGEgdG8gY29uc2lkZXIKIycgQHBhcmFtIG5mY3N0IC0gbnVtYmVyIG9mIGZvcmVjYXN0cyB0byBtYWtlCiMnIEBwYXJhbSBtb2RlbCAtIG1vZGVsIHRvIHVzZSAoaW50ZWdlcnMgMSB0aHJvdWdoIDQpLiBEZWZhdWx0cyB0byAxLiAKIycgQHBhcmFtIGxldmVsIC0gbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlIHRvIHVzZS4KIycgQHBhcmFtIEcgLSBhcmd1bWVudCBmb3IgdGhlIGsgcGFyYW1ldGVyIGluIHRoZSA0dGggbW9kZWwgKGFkYXB0aXZlKS4gRGVmYXVsdCBpcyA1CiMnCiMnIEByZXR1cm4gLSBhbiB4dHMgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHJvbGxpbmcgQ0FWaWFSIHByZWRpY3Rpb25zCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gcm9sbGluZ19wcmVkaWN0aW9ucyhzcHksIG5mY3N0ID0gMjIpCnJvbGxpbmdfcHJlZGljdGlvbnMgPSBmdW5jdGlvbihpbnB1dF9kYXRhLCByYW5nZV9kYXRhID0gKDI6ZGltKGlucHV0X2RhdGEpWzFdKSwgbmZjc3QgPSAyNTAsIG1vZGVsID0xLCBsZXZlbCA9IDAuMDEsIEcgPSA1LCBjb2wgPSAyKXsKICAjIFJ1biB0aGUgdmFycHJlZGljdCBmdW5jdGlvbgogIHZhcnByZWRpY3QgPC0gcm9sbGFwcGx5cihpbnB1dF9kYXRhW3JhbmdlX2RhdGEsY29sXSwgbGVuZ3RoKHJhbmdlX2RhdGEpIC0gbmZjc3QsIGNhdmlhck9wdGltLCBtb2RlbCwgbGV2ZWwsIHByZWRpY3QgPSAxLCBrID0gRykgJT4lIGxhZwogICMgRWxpbWluYXRlIE5BcwogICMgcHJlZF9ub19uYSA9IG5hLm9taXQodmFycHJlZGljdCkKICAjIFJldHVybiB0aGUgZGF0YQogICMgcmV0dXJuKHByZWRfbm9fbmEpCiAgcmV0dXJuKHZhcnByZWRpY3QpCn0KCmBgYAoKYGBge3J9CiMnIEZ1bmN0aW9uIHRvIENhbGN1bGF0ZSBMb3NzIGZyb20gdGhlIGFib3ZlIHByZWRpY3Rpb25zCiMnCiMnIEBwYXJhbSBzeW1ib2wgLSBzeW1ib2wgdG8gd29yayB3aXRoIGZyb20gcXVhbnRtb2QuIE11c3QgYmUgaW4gcXVvdGF0aW9ucyB0byB3b3JrCiMnIEBwYXJhbSBzdGFydF9kdCAtIHN0YXJ0IGRhdGUgb2YgdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGZvcmVjYXN0IG9uIAojJyBAcGFyYW0gZW5kX2R0IC0gZW5kIGRhdGUgb2YgdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGZvcmVjYXN0IG9uICAKIycgQHBhcmFtIG5mY3N0IC0gbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRvIHVzZSBpbiB0aGUgZm9yZWNhc3QKIycgQHBhcmFtIG1vZGVsIC0gbW9kZWwgdG8gdXNlLiBEZWZhdWx0cyB0byAxCiMnIEBwYXJhbSBsZXZlbCAtIGxldmVsIG9mIHNpZ25pZmljYW5jZS4gRGVmYXVsdHMgdG8gMSUKIycgQHBhcmFtIEcgLSBhcmd1bWVudCBmb3IgdGhlIGsgcGFyYW1ldGVyIGluIHRoZSA0dGggbW9kZWwgKGFkYXB0aXZlKS4gRGVmYXVsdCBpcyA1CiMnCiMnIEByZXR1cm4gLSBsb3NzIHVzaW5nIGFic29sdXRlIHZhbHVlCiMnIEBleHBvcnQgLSBhIHBsb3Qgb2YgdGhlIGRhdGEKIycKIycgQGV4YW1wbGVzCmxvc3NfY2FsY191diA9IGZ1bmN0aW9uKHN5bWJvbCwgc3RhcnRfZHQsIGVuZF9kdCwgbmZjc3QsIG1vZGVsID0gMSwgbGV2ZWwgPSAwLjAxLCBHID0gNSl7CiAgIyBQdWxsIGluIHRoZSBkYXRhCiAgcmF3X2RhdGEgPSBkYXRhX3B1bGwoc3ltYm9sLCBzdGFydF9kYXRlID0gc3RhcnRfZHQsIGVuZF9kYXRlID0gZW5kX2R0KQogICMgRm9yZWNhc3QgYmFzZWQgb24gdGhlIGRhdGEKICBmY3N0ID0gbmEub21pdChyb2xsaW5nX3ByZWRpY3Rpb25zKHJhd19kYXRhLCBuZmNzdCA9IG5mY3N0LCBtb2RlbCA9IG1vZGVsLCBsZXZlbCA9IGxldmVsLCBHID0gRykpKigtMSkKICAjIEV4dHJhY3QgYWN0dWFscwogIGFjdCA9IHRhaWwocmF3X2RhdGEsIG4gPSBuZmNzdClbLDJdCiAgIyBKb2luIHRoZSB0d28gdG9nZXRoZXIgYW5kIHJlbmFtZQogIGpvaW4gPSBtZXJnZShmY3N0LGFjdCxhbGw9VFJVRSkKICBjb2xuYW1lcyhqb2luKSA8LSBjKCJGY3N0X1ZhUiIsICJBY3RfUmV0dXJuIikKICAjIHByaW50KGpvaW4pCiAgIyBDYWxjdWxhdGUgdGhlIGxvc3NlcwogIGxvc3MgPSBhYnMoc3VtKGlmZWxzZShhY3QgPiBmY3N0LCBsZXZlbCwgKC0xKSooMS1sZXZlbCkpKSkKICAjIFBsb3QgdGhlIGRhdGEKICBwbG90ID0gcGxvdC54dHMoam9pbiwgY29sID0gYygicmVkIiwgImJsYWNrIiksIGx0eSA9IGMoMiwxKSwgbWFpbiA9ICJMb2cgUmV0dXJuIGZyb20gdGhlIFNQWSB2cy4gRmNzdC4gVmFSIixncmlkLmNvbCA9IE5BLCBsZWdlbmQubG9jID0gImJvdHRvbWxlZnQiKQogIHJldHVybihsaXN0KGxvc3MsIHBsb3QsIGFjdCwgZmNzdCkpCn0KCmBgYAoKIyMgTVYgQ2F2aWFyIC0gUHVsbGluZyB0aGUgZGF0YQoKYGBge3IsIGNhY2hlID0gVFJVRX0KIycgVGhpcyBpcyBhIGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBkYXRhIGZyYW1lIGZvciB0aGUgcmVzcG9uc2UgYW5kIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyB0aGF0IHdlJ2xsIGZlZWQgaW50byB0aGUgZGlmZnVzaW9uIGluZGV4CiMnCiMnIEBwYXJhbSBzeW1ib2xfbGlzdCAtIGEgbGlzdCBvZiBzeW1ib2xzIHJlY29nbml6YWJsZSBieSB0aGUgCiMnIEBwYXJhbSByZXNwX3ZhciAtIHRoZSByZXNwb25zZSB2YXJpYWJsZSB3ZSdkIGxpa2UgdG8gZm9yZWNhc3Q7IGRlZmF1bHQgaXMgU1BZCiMnIEBwYXJhbSBjb21wbF9jYXNlIC0gZGVmYXVsdHMgdG8gdHJ1ZS4uLm9ubHkgaW5jbHVkZXMgY29tcGxldGUgY2FzZXMgaW4gdGhlIGRhdGEKIycgQHBhcmFtIGFkal9jbG9zZSAtIHVzZSBhZGp1c3RlZCBjbG9zaW5nIHByaWNlcyBmb3IgdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcz8gZGVmYXVsdCBpcyAxIGZvciBZRVMKIycgQHBhcmFtIHJlc3BfYWRqX2Nsb3NlIC0gdXNlIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzIGZvciB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzPyBkZWZhdWx0IGlzIDEgZm9yIFlFUwojJyBAcGFyYW0gc3RhcnRfZGF0ZSAtIHN0YXJ0aW5nIGRhdGEgdG8gdXNlCiMnIEBwYXJhbSBlbmRfZGF0ZSAtIGVuZGluZyBkYXRlIG9mIHRoZSBkYXRhCiMnIEBwYXJhbSBsYWdfcHJlZCAtIGRvIHdlIGxhZyB0aGUgcHJlZGljdGlvbnM/IEl0IGlzIFNUUk9OR0xZIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBpcyAwCiMnCiMnIEByZXR1cm4gLSBhIGRhdGEgZnJhbWUgd2hpY2ggY2FuIGJlIGZlZCBpbnRvIHRoZSBTV2ZvcmUgZnVuY3Rpb24KIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBkaWZmX2luZGV4X2RmKGMoIlhMRiIsICJYTEUiLCAiUFNDVCIsICJYTFYiLCAiVlBVIiwgIlhMUCIsICJJR0YiLCAiWFdFQiIsICJQUFRZIikpCmRpZmZfaW5kZXhfZGYgPSBmdW5jdGlvbihzeW1ib2xfbGlzdCwgcmVzcF92YXIgPSAiU1BZIiwgY29tcGxfY2FzZSA9IDEsIGFkal9jbG9zZSA9IDEsIHJlc3BfYWRqX2Nsb3NlID0gMSwgc3RhcnRfZGF0ZSA9ICIxOTAwLTAxLTAxIiwgZW5kX2RhdGUgPSBTeXMuRGF0ZSgpLCBsYWdfcHJlZCA9IDEpewogICMgUHVsbCBpbiByZXNwb25zZSB2YXJpYWJsZQogIHJlc3BvbnNlX3B1bGwgPSBnZXRTeW1ib2xzKHJlc3BfdmFyLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKICAjIEdldCBhZGp1c3RlZCBjbG9zaW5nIHByaWNlCiAgaWYgKHJlc3BfYWRqX2Nsb3NlID09IFRSVUUpewogICAgZGlmZl9kZiA9IEFkKHJlc3BvbnNlX3B1bGwpCiAgfSBlbHNlIHsKICAgIGRpZmZfZGYgPSBDbChyZXNwb25zZV9wdWxsKQogIH0KICAjIExvb3AgdGhyb3VnaCB0aGUgc3ltYm9scyBhbmQgam9pbiBpbiBkYXRhCiAgZm9yIChpIGluIDE6bGVuZ3RoKHN5bWJvbF9saXN0KSl7CiAgICAjIFB1bGwgY2xvc2luZyBwcmljZQogICAgZXhwbF9wdWxsID0gZ2V0U3ltYm9scyhzeW1ib2xfbGlzdFtpXSwgYXV0by5hc3NpZ24gPSBGQUxTRSwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCiAgICAjIEV4dHJhY3QgY2xvc2luZyBwcmljZSAtIDR0aCBlbGVtZW50CiAgICBpZiAoYWRqX2Nsb3NlID09IFRSVUUpewogICAgICBleHBsX2NsID0gQWQoZXhwbF9wdWxsKQogICAgfSBlbHNlIHsKICAgICAgZXhwbF9jbCA9IENsKGV4cGxfcHVsbCkKICAgIH0KICAgICMgTmV3IGNvZGUgZm9yIDQuMTYuMjAyMCAtIGxhZyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGVzCiAgICBpZiAobGFnX3ByZWQgPT0gVFJVRSl7CiAgICAgICMgTGFnIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgYnkgMQogICAgICBsYWdfZXhwID0gbGFnKGV4cGxfY2wsIDEpCiAgICAgICMgQXBwZW5kIHRoZSBmaXJzdCBsYWcgdG8gdGhlIGRhdGEgZnJhbWUKICAgICAgZGlmZl9kZiA9IG1lcmdlKGRpZmZfZGYsIGxhZ19leHAsIGpvaW4gPSAibGVmdCIsIGZpbGwgPSBOQSkKICAgIH0gZWxzZXsKICAgICAgIyBSZXR1cm4gdGhlIGRhdGEgZnJhbWUgd2l0aG91dCBsYWdzCiAgICAgIGRpZmZfZGYgPSBtZXJnZShkaWZmX2RmLCBleHBsX2NsLCBqb2luID0gImxlZnQiLCBmaWxsID0gTkEpCiAgICB9CiAgfQogIGlmIChsYWdfcHJlZCA9PSBUUlVFKXsKICAgICMgQ2hvcCBvZmYgdGhlIGZpcnN0IHJvdwogICAgZGlmZl9kZiA9IGRpZmZfZGZbLTEsXQogIH0KICBlbHNlIHsKICAgIHByaW50KCJQTEVBU0UgTk9URSAtIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgaW4gdGhpcyBERiBhcmUgTk9UIGxhZ2dlZC4gQmUgY2FyZWZ1bCB0byBhdm9pZCBsb29rLWFoZWFkIGJpYXMhIikKICB9CiAgIyBSZXR1cm4gY29tcGxldGUgY2FzZXMgb25seSAKICBpZiAoY29tcGxfY2FzZSA9PSBUUlVFKXsKICAgIGRpZmZfZGZfb3V0ID0gZGlmZl9kZltjb21wbGV0ZS5jYXNlcyhkaWZmX2RmKSwgXQogIH0gZWxzZXsKICAgIGRpZmZfZGZfb3V0ID0gZGlmZl9kZgogIH0KICAKICByZXR1cm4oZGlmZl9kZl9vdXQpCn0KCmBgYAoKYGBge3IsIGNhY2hlID0gVFJVRX0KIycgQ29udmVydHMgYSBkaWZmX2RmIGludG8gYSBkYXRhIGZyYW1lIHdpdGggYXBwcm94aW1hdGUgcGVyY2VudGFnZSBjaGFuZ2VzIGRpZmYobG9nKGRpZmZfZGYpKQojJwojJyBAcGFyYW0gZGlmZl9kZiAtIG91dHB1dCBvZiB0aGUgZGlmZl9pbmRleF9kZiBmdW5jdGlvbiB3aXRoIGNvbXBsZXRlIGNhc2VzCiMnCiMnIEByZXR1cm4gLSByZXR1bnMgdGhlIGRpZmZlcmVuY2VkIGRhdGEKIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBwY19kaWZmX2luZGV4KHRlc3RfY29tcGwpIAoKcGNfZGlmZl9pbmRleCA9IGZ1bmN0aW9uKGRpZmZfZGYpewogICMgRGlmZmVyZW5jZSB0aGUgbG9nIG9mIHRoZSBkYXRhCiAgcGNfZGlmZl9pbmRleCA9IGRpZmYobG9nKGRpZmZfZGYpKQogICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cKICBwY19kaWZmX2luZGV4X291dCA9IHBjX2RpZmZfaW5kZXhbLTEsXQogIHJldHVybihwY19kaWZmX2luZGV4X291dCkKfQoKYGBgCgojIyBNViBDYXZpYXIgLSBNb2RpZmllZCBESSBjb2RlCgpUaGUgY29kZSB0aGF0IGlzIHVzZWQgaW4gYSBkaWZmdXNpb24gaW5kZXggbW9kZWwgaXMgYXMgZm9sbG93cy4gVGhlIGtleSBpcyBmaWd1cmluZyBvdXQgd2hlcmUgdG8gbWFrZSB0aGUgZXh0ZW5zaW9uLiBJJ2xsIGdvIHRocm91Z2ggYW5kIGNvbW1lbnQgZXZlcnl0aGluZyBhbmQgc2VlIHdoYXQncyB3aGF0LgoKYGBge3J9CiMnIEJlbG93IGlzIHRoZSBtb2RpZmllZCBkaWZmdXNpb24gaW5kZXggY29kZS4KIycKIycgQHBhcmFtIHkgLSByZXNwb25zZSB2YXJpYWJsZQojJyBAcGFyYW0geCAtIHByZWRpY3RvciB2YXJpYWJsZXMKIycgQHBhcmFtIG9yaWcgLSBmb3JlY2FzdCBvcmlnaW4KIycgQHBhcmFtIG0gLSBudW1iZXIgb2YgZGlmZnVzaW9uIGluZGV4ZXMgdXNlZAojJyBAcGFyYW0gdGF1IC0gVmFSIGxldmVsIHRvIHVzZTsgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEKIycgQHBhcmFtIGVuZCAtIHNwZWNpZmllcyBhbiBhbHRlcm5hdGUgZW5kaW5nIHZhbHVlCiMnIEBwYXJhbSBwcmludF9tZGwgLSBwcmludCB0aGUgbW9kZWwgc3VtbWFyeSBhbmQgdGhlIE1TRQojJwojJyBAcmV0dXJuIC0gcmV0dXJucyBhIGxpc3Qgb2YgdmFyaWFibGVzIGZvciB1c2UgaW4gdGhlIGRpZmZ1c2lvbiBpbmRleAojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcwptb2RfZGkgPSBmdW5jdGlvbiAoeSwgeCwgb3JpZywgbSwgdGF1LCBlbmQgPSBOVUxMLCBwcmludF9tZGwgPSAwKSAKewogICMgQ29udmVydHMgdGhlIHJlc3BvbnNlIHZhcmlhYmxlcyBpbnRvIGEgbWF0cml4CiAgaWYgKCFpcy5tYXRyaXgoeCkpIAogICAgICB4ID0gYXMubWF0cml4KHgpCiAgIyBuVCBpcyBudW1iZXIgb2YgdCB0aW1lLXN0ZXBzCiAgblQgPSBkaW0oeClbMV0KICAjIEFkZCBhIGxpbmUgdG8gZXN0YWJsaXNoIHRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHMgdXNlZCBpbiB0aGUgdGVzdC4KICBpZiAoaXMubnVsbChlbmQpICE9IFRSVUUpewogICAgblQgPSBlbmQKICB9CiAgIyBrIGlzIHRoZSBudW1iZXIgb2YgZGlmZnVzaW9uIGluZGljZXMgdXNlZAogIGsgPSBkaW0oeClbMl0KICAjIFNhbml0eSBjaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlIG9yaWdpbiBpc24ndCBwYXN0IHRoZSBudW1iZXIgb2YgdGltZSBwb2ludHMKICBpZiAob3JpZyA+IG5UKSAKICAgICAgb3JpZyA9IG5UCiAgIyBNYWtlcyBzdXJlIHRoYXQgdGhlcmUgYXJlbid0IG1vcmUgcHJlZGljdG9ycyB0aGFuIHRoZXJlIHZhcmlhYmxlcyBpbiB0aGUgZGF0YXNldAogIGlmIChtID4gaykgCiAgICAgIG0gPSBrCiAgIyBNYWtlcyBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCBzb21lIHZhcmlhYmxlcwogIGlmIChtIDwgMSkgCiAgICAgIG0gPSAxCiAgIyBTdWJkaXZpZGVzIHRoZSBkYXRhZnJhbWUKICB4MSA9IHhbMTpvcmlnLCBdCiAgIyBDYWxjdWxhdGVzIG1lYW5zIG9mIGVhY2ggcm93CiAgbWUgPSBhcHBseSh4MSwgMiwgbWVhbikKICAjIENhbGN1bGF0ZXMgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBlYWNoIGNvbHVtbgogIHNlID0gc3FydChhcHBseSh4MSwgMiwgdmFyKSkKICAjIENyZWF0ZXMgYSBtYXRyaXggeDEsIHdoaWNoIG5vcm1hbGl6ZXMgYWxsIHRoZSBjb2x1bW5zLiAKICAjIFRoaXMgbWF5IGJlIGFuIGlzc3VlIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHN1ZmZpY2llbnRseSBkZXNjcmliZWQgYnkgdGhlIGZpcnN0IHR3byBtb21lbnRzCiAgeDEgPSB4CiAgZm9yIChpIGluIDE6aykgewogICAgICB4MVssIGldID0gKHgxWywgaV0gLSBtZVtpXSkvc2VbaV0KICB9CiAgVjEgPSBjb3YoeDFbMTpvcmlnLCBdKQogICMgUGVyZm9ybXMgYW4gZWlnZW4gZGVjb21wb3NpdGlvbgogIG0xID0gZWlnZW4oVjEpCiAgIyBTZWxlY3RzIGVpZ2VudmFsdWVzCiAgc2RldiA9IG0xJHZhbHVlcwogICMgU2VsZWN0cyBlaWdlbnZlY3RvcnMKICBNID0gbTEkdmVjdG9ycwogICMgTWFrZXMgYSBzbWFsbGVyIG1hdHJpeAogIE0xID0gTVssIDE6bV0KICAjIFRoaXMgaXMgdGhlIGRpZmZ1c2lvbiBpbmRleCBtb2RlbCAtIFtvcmlnIHggcF0qW3AgeCBtXSA9IFtvcmlnIHggbV0KICBEaW5kZXggPSB4MSAlKiUgTTEKICAjIEN1dCBkb3duIGJvdGggdGhlIHJlc3BvbnNlIGFuZCBwcmVkaWN0b3JzIHRvIGJlIGEgcmVhc29uYWJsZSBzaXplCiAgeTEgPSB5WzE6b3JpZ10KICBERiA9IERpbmRleFsxOm9yaWcsIF0KICAjIEFwcGx5IHRoZSBsaW5lYXIgbW9kZWwgLSBIRVJFIGlzIHRoZSBrZXkuCiAgIyBtbSA9IGxtKHkxIH4gREYpIC0gb2xkIGZ1bmN0aW9uCiAgbW0gPSBycSh5MSB+IERGLCB0YXUgPSB0YXUpCiAgIyBQcmludCB0aGUgZGF0YQogIGlmIChwcmludF9tZGwgPT0gMSl7CiAgICBwcmludChzdW1tYXJ5KG1tKSkKICB9CiAgIyBQdXRzIGNvZWZmaWNpZW50cyBpbiBhIG1hdHJpeAogIGNvZWYgPSBtYXRyaXgobW0kY29lZmZpY2llbnRzLCAobSArIDEpLCAxKQogICMgSW5pdGlhbGl6ZXMgeWhhdCB2YXJpYWJsZXMgYW5kIE1TRQogIHloYXQgPSBOVUxMCiAgTVNFID0gTlVMTAogIGlmIChvcmlnIDwgblQpIHsKICAgICMgQ3JlYXRlcyBhIG5mY3N0IGJ5IChtKzEpIG1hdHJpeAogICAgbmV3eCA9IGNiaW5kKHJlcCgxLCAoblQgLSBvcmlnKSksIERpbmRleFsob3JpZyArIDEpOm5ULCAKICAgICAgICBdKQogICAgIyBbbmZjc3R4KG0rMSldKlsobSsxKXgxXSA9IFtuZmNzdHgxXQogICAgeWhhdCA9IG5ld3ggJSolIGNvZWYKICAgICMgQ2FsY3VsYXRlcyBlcnJvcnMKICAgIGVyciA9IHlbKG9yaWcgKyAxKTpuVF0gLSB5aGF0CiAgICBNU0UgPSBtZWFuKGVycl4yKQogICAgaWYgKHByaW50X21kbCA9PSAxKXsKICAgICAgY2F0KCJNU0Ugb2Ygb3V0LW9mLXNhbXBsZSBmb3JlY2FzdHM6ICIsIE1TRSwgIlxuIikKICAgIH0KICB9CiAgU1dmb3JlIDwtIGxpc3QoY29lZiA9IGNvZWYsIHloYXQgPSB5aGF0LCBNU0UgPSBNU0UsIGxvYWRpbmdzID0gTTEsIAogICAgICBERmluZGV4ID0gRGluZGV4KQp9CgpgYGAKCk5vdyB0aGF0IHdlIGhhdmUgdGhlIGZ1bmN0aW9uLCBsZXQncyBzZWUgaWYgd2UgY2FuIGdldCBpdCB0byB3b3JrLiBGaXJzdCwgd2UnbGwgbmVlZCB0byBjb21waWxlIGFsbCBvZiBvdXIgZGF0YQoKTGV0J3MgYWRkIGEgY29kZSB3aGljaCBpbmNvcnBvcmF0ZXMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiB0aGUgcmV0dXJuLgoKYGBge3J9CiMnIEJlbG93IGlzIHRoZSBtb2RpZmllZCBkaWZmdXNpb24gaW5kZXggY29kZSB0byBpbmNsdWRlIGxhZ2dlZCB2YXJpYWJsZXMuCiMnCiMnIEBwYXJhbSB5IC0gcmVzcG9uc2UgdmFyaWFibGUKIycgQHBhcmFtIHggLSBwcmVkaWN0b3IgdmFyaWFibGVzCiMnIEBwYXJhbSBvcmlnIC0gZm9yZWNhc3Qgb3JpZ2luCiMnIEBwYXJhbSBtIC0gbnVtYmVyIG9mIGRpZmZ1c2lvbiBpbmRleGVzIHVzZWQKIycgQHBhcmFtIHRhdSAtIFZhUiBsZXZlbCB0byB1c2U7IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxCiMnIEBwYXJhbSBhcl90ZiAtIEFSIHRyYW5zZm9ybWF0aW9uIHR5cGUuICgxIC0gbm8gdHJhbnNmb3JtYXRpb24sCiMnIDIgLSBhYnNvbHV0ZSB2YWx1ZSwgMyAtIGFzeW1tZXRyaWMgc2xvcGUpCiMnIEBwYXJhbSBwIC0gbnVtYmVyIG9mIEFSIGxhZ3MgdG8gaW5jbHVkZS4gRGVmYXVsdCBpcyBvbmUuCiMnIEBwYXJhbSBwcmludF9tZGwgLSBvcHRpb24gdG8gcHJpbnQgdGhlIG1vZGVsIHN1bW1hcnkgdG8gbWFrZSBzdXJlIGV2ZXJ5dG5pbmcgaXMgb2suIDAgaXMgZGVmYXVsdC4KIycgQHBhcmFtIG1vZGVsIC0gbW9kZWwgdHlwZSAoMSAtIFNBViwgMiAtIEFTLCAzIC0gR0FSQ0gsIDQgLSBBREFQVElWRSkgCiMnCiMnIEByZXR1cm4gLSByZXR1cm5zIGEgbGlzdCBvZiB2YXJpYWJsZXMgZm9yIHVzZSBpbiB0aGUgZGlmZnVzaW9uIGluZGV4CiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzCm1vZF9kaV93bCA9IGZ1bmN0aW9uICh5LCB4LCBvcmlnLCBtLCB0YXUsIGFyX3RmID0gMSwgcCA9IDEsIHByaW50X21kbCA9IDAsIG1vZGVsID0gMSwgZW5kID0gTlVMTCkgCnsKICAjIENvbnZlcnRzIHRoZSByZXNwb25zZSB2YXJpYWJsZXMgaW50byBhIG1hdHJpeAogIGlmICghaXMubWF0cml4KHgpKSAKICAgICAgeCA9IGFzLm1hdHJpeCh4KQogICMgblQgaXMgbnVtYmVyIG9mIHQgdGltZS1zdGVwcwogIG5UID0gZGltKHgpWzFdCiAgIyBBZGQgYSBsaW5lIHRvIGVzdGFibGlzaCB0aGUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHVzZWQgaW4gdGhlIHRlc3QuCiAgaWYgKGlzLm51bGwoZW5kKSAhPSBUUlVFKXsKICAgIG5UID0gZW5kCiAgfQogICMgayBpcyB0aGUgbnVtYmVyIG9mIGRpZmZ1c2lvbiBpbmRpY2VzIHVzZWQKICBrID0gZGltKHgpWzJdCiAgIyBTYW5pdHkgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSBvcmlnaW4gaXNuJ3QgcGFzdCB0aGUgbnVtYmVyIG9mIHRpbWUgcG9pbnRzCiAgaWYgKG9yaWcgPiBuVCkgCiAgICAgIG9yaWcgPSBuVAogICMgTWFrZXMgc3VyZSB0aGF0IHRoZXJlIGFyZW4ndCBtb3JlIHByZWRpY3RvcnMgdGhhbiB0aGVyZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQKICBpZiAobSA+IGspIAogICAgICBtID0gawogICMgTWFrZXMgc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3Qgc29tZSB2YXJpYWJsZXMKICBpZiAobSA8IDEpIAogICAgICBtID0gMQogICMgU3ViZGl2aWRlcyB0aGUgZGF0YWZyYW1lCiAgeDEgPSB4WzE6b3JpZywgXQogICMgQ2FsY3VsYXRlcyBtZWFucyBvZiBlYWNoIHJvdwogIG1lID0gYXBwbHkoeDEsIDIsIG1lYW4pCiAgIyBDYWxjdWxhdGVzIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgZWFjaCBjb2x1bW4KICBzZSA9IHNxcnQoYXBwbHkoeDEsIDIsIHZhcikpCiAgIyBDcmVhdGVzIGEgbWF0cml4IHgxLCB3aGljaCBub3JtYWxpemVzIGFsbCB0aGUgY29sdW1ucy4gCiAgIyBUaGlzIG1heSBiZSBhbiBpc3N1ZSBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzdWZmaWNpZW50bHkgZGVzY3JpYmVkIGJ5IHRoZSBmaXJzdCB0d28gbW9tZW50cwogIHgxID0geAogIGZvciAoaSBpbiAxOmspIHsKICAgICAgeDFbLCBpXSA9ICh4MVssIGldIC0gbWVbaV0pL3NlW2ldCiAgfQogIFYxID0gY292KHgxWzE6b3JpZywgXSkKICAjIFBlcmZvcm1zIGFuIGVpZ2VuIGRlY29tcG9zaXRpb24KICBtMSA9IGVpZ2VuKFYxKQogICMgU2VsZWN0cyBlaWdlbnZhbHVlcwogIHNkZXYgPSBtMSR2YWx1ZXMKICAjIFNlbGVjdHMgZWlnZW52ZWN0b3JzCiAgTSA9IG0xJHZlY3RvcnMKICAjIE1ha2VzIGEgc21hbGxlciBtYXRyaXgKICBNMSA9IE1bLCAxOm1dCiAgIyBUaGlzIGlzIHRoZSBkaWZmdXNpb24gaW5kZXggbW9kZWwgLSBbb3JpZyB4IHBdKltwIHggbV0gPSBbb3JpZyB4IG1dCiAgRGluZGV4ID0geDEgJSolIE0xCiAgIyBDdXQgZG93biBib3RoIHRoZSByZXNwb25zZSBhbmQgcHJlZGljdG9ycyB0byBiZSBhIHJlYXNvbmFibGUgc2l6ZQogIHkxID0geVsxOm9yaWddCiAgREYgPSBEaW5kZXhbMTpvcmlnLCBdCiAgIyBDb3B5IHRoZSBkYXRhIGZyYW1lCiAgREZfd2wgPSBEaW5kZXgKICAjIExhZyB0aGUgeS12YXJpYWJsZQogIGZvciAoaSBpbiAxOnApewogICAgIyBDcmVhdGUgYSBsYWdnZWQgdmFyaWFibGUKICAgIGxhZ192YXIgPSBsYWcoeSwgaSkKICAgICMgQXBwZW5kIHRoZSBmaXJzdCBsYWcgdG8gdGhlIGRhdGEgZnJhbWUKICAgIERGX3dsID0gY2JpbmQoREZfd2wsbGFnX3ZhcikKICB9CiAgIyBJZGVudGlmeSB0aGUgcmlnaHQgY29sdW1ucwogIGxfYXIgPSBuY29sKERGX3dsKQogIGZfYXIgPSBsX2FyIC0gcCArIDEKICAjIEtlZXAgdGhlIGxhc3QgY29sdW1ucyBrZXB0IHRvIHRoZSBzaWRlCiAgYWxsX2xhZyA9IERGX3dsWywoZl9hcjpsX2FyKV0KICAjIEN1dCBvZmYgdGhlIGZpcnN0IHJvdyB0byBhdm9pZCBOQSdzCiAgREZfdHJpbSA9IERGX3dsWzE6b3JpZyxdCiAgIyBSZW5hbWUgdGhlIGNvbHVtbnMKICAjIEhlcmUncyB0aGUgbmV3IGZ1bmN0aW9uIHdpdGggYW4gdW50cmFuc2Zvcm1lZCBBUihwKSBsYWcKICBpZiAoYXJfdGYgPT0gMSl7CiAgICAjIEluY29ycG9yYXRlIGV2ZXJ5dGhpbmcgaW4gdG8gYW4gaW5wdXQgZGF0YSBmcmFtZQogICAgZGZfaW4gPSBjYmluZCh5MVstKDE6cCldLCBERl90cmltWy0oMTpwKSxdKQogICAgIyBSZW5hbWUgdGhlIGNvbHVtbnMKICAgICMgSW5pdGlhbGl6ZSBhIGNoYXJhY3RlciB2ZWN0b3IKICAgIG52ZWMgPSBjKHJlcCgwLCAxK20rcCkpCiAgICAjIFBvcHVsYXRlIHRoZSB2ZWN0b3IgLSBmaXJzdCB2YWx1ZSBpcyB0aGUgcmVzcG9uc2UKICAgIG52ZWNbMV0gPC0gbmFtZXMoeSkKICAgICMgTmV4dCBhcmUgdGhlIGRpZmZ1c2lvbiBpbmRpY2VzCiAgICBmb3IgKGkgaW4gMTptKXsKICAgICAgbnZlY1tpKzFdID0gcGFzdGUwKCJEaWZmX0luZGV4XyIsIGkpCiAgICB9CiAgICAjIE5leHQgYXJlIHRoZSBsYWdnZWQgdmFyaWFibGVzCiAgICBmb3IgKGkgaW4gMTpwKXsKICAgICAgbnZlY1tpKzErbV0gPSBwYXN0ZTAoIkxhZ18iLCBpKQogICAgfQogICAgIyBBc3NpZ24gdGhlIG5hbWVzCiAgICBuYW1lcyhkZl9pbikgPC0gbnZlYwogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBtbSA9IHJxKGRmX2luWywxXSB+IGRmX2luWywtMV0sIHRhdSA9IHRhdSkKICB9CiAgIyBIZXJlJ3MgdGhlIG5ldyBmdW5jdGlvbiB3aXRoIGFuIFNBViBBUihwKSBsYWcKICBpZiAoYXJfdGYgPT0gMil7CiAgICAjIEluY29ycG9yYXRlIGV2ZXJ5dGhpbmcgaW4gdG8gYW4gaW5wdXQgZGF0YSBmcmFtZQogICAgZGZfaW4gPSBjYmluZCh5MVstKDE6cCldLCBERl90cmltWy0oMTpwKSwtKGZfYXI6bF9hcildLCBhYnMoREZfdHJpbVstKDE6cCksKGZfYXI6bF9hcildKSkKICAgICMgUmVuYW1lIHRoZSBjb2x1bW5zCiAgICAjIEluaXRpYWxpemUgYSBjaGFyYWN0ZXIgdmVjdG9yCiAgICBudmVjID0gYyhyZXAoMCwgMSttK3ApKQogICAgIyBQb3B1bGF0ZSB0aGUgdmVjdG9yIC0gZmlyc3QgdmFsdWUgaXMgdGhlIHJlc3BvbnNlCiAgICBudmVjWzFdIDwtIG5hbWVzKHkpCiAgICAjIE5leHQgYXJlIHRoZSBkaWZmdXNpb24gaW5kaWNlcwogICAgZm9yIChpIGluIDE6bSl7CiAgICAgIG52ZWNbaSsxXSA9IHBhc3RlMCgiRGlmZl9JbmRleF8iLCBpKQogICAgfQogICAgIyBOZXh0IGFyZSB0aGUgbGFnZ2VkIHZhcmlhYmxlcwogICAgZm9yIChpIGluIDE6cCl7CiAgICAgIG52ZWNbaSsxK21dID0gcGFzdGUwKCJMYWdfIiwgaSkKICAgIH0KICAgICMgQXNzaWduIHRoZSBuYW1lcy4gTm90ZSB0aGF0IHRoaXMgaXMgYSBtYXRyaXgKICAgIG5hbWVzKGRmX2luKSA8LSBudmVjCiAgICAjIFJ1biB0aGUgbW9kZWwKICAgIG1tID0gcnEoZGZfaW5bLDFdIH4gZGZfaW5bLC0xXSwgdGF1ID0gdGF1KQogIH0KICAjIEhlcmUncyB0aGUgbmV3IGZ1bmN0aW9uIHdpdGggYW4gYXN5bW1ldHJpYyBzbG9wZSBmb3IgdGhlIEFSKDEpIGxhZwogICMgSW5kaWNhdG9yOyAwIGlmIHBlcmNlbnQgY2hhbmdlIGlzIG5lZ2F0aXZlLCAxIGlmIGl0J3MgcG9zaXRpdmUKICAjIGluZGkgPSBpZmVsc2UoREZfdHJpbVssYXJdIDwgMCwgMCwgMSkKICBpZiAoYXJfdGYgPT0gMyl7CiAgICAjIENyZWF0ZSBhIG1hdHJpeCBvZiBpbmRpY2F0b3JzCiAgICBpbmRpX21hdCA9IG1hdHJpeCgwLCBucm93KERGX3dsKSwgcCkKICAgICMgR2VuZXJhbGl6ZSB0aGUgYWJvdmUgY29kZQogICAgZm9yIChpIGluIDE6cCl7CiAgICAgICMgUG9wdWxhdGUgdGhlIGluZGljYXRvcgogICAgICBpbmRpX21hdFssaV0gPSBpZmVsc2UoREZfd2xbLGZfYXIgKyBpIC0gMV0gPCAwLCAwLCAxKQogICAgfQogIH0KICAjIEZpdHRpbmcgdGhlIHJlZ3Jlc3Npb24KICBpZiAoYXJfdGYgPT0gMyl7CiAgICAjIEluY29ycG9yYXRlIGV2ZXJ5dGhpbmcgaW4gdG8gYW4gaW5wdXQgZGF0YSBmcmFtZQogICAgZGZfaW4gPSBjYmluZCh5MVstKDE6cCldLCBERl90cmltWy0oMTpwKSwtKGZfYXI6bF9hcildLCBERl90cmltWy0oMTpwKSwoZl9hcjpsX2FyKV0sIGluZGlfbWF0WygocCsxKTpvcmlnKSxdKQogICAgIyBSZW5hbWUgdGhlIGNvbHVtbnMKICAgICMgSW5pdGlhbGl6ZSBhIGNoYXJhY3RlciB2ZWN0b3IKICAgIG52ZWMgPSBjKHJlcCgwLCAxK20rMipwKSkKICAgICMgUG9wdWxhdGUgdGhlIHZlY3RvciAtIGZpcnN0IHZhbHVlIGlzIHRoZSByZXNwb25zZQogICAgbnZlY1sxXSA8LSBuYW1lcyh5KQogICAgIyBOZXh0IGFyZSB0aGUgZGlmZnVzaW9uIGluZGljZXMKICAgIGZvciAoaSBpbiAxOm0pewogICAgICBudmVjW2krMV0gPSBwYXN0ZTAoIkRpZmZfSW5kZXhfIiwgaSkKICAgIH0KICAgICMgTmV4dCBhcmUgdGhlIGxhZ2dlZCB2YXJpYWJsZXMKICAgIGZvciAoaSBpbiAxOnApewogICAgICBudmVjW2krMSttXSA9IHBhc3RlMCgiTGFnXyIsIGkpCiAgICB9CiAgICAjIExhc3QgYXJlIHRoZSBwb3NpdGl2ZSBpbmRpY2F0b3IgdmFyaWFibGVzCiAgICBmb3IgKGkgaW4gMTpwKXsKICAgICAgbnZlY1tpKzErbStwXSA9IHBhc3RlMCgiUG9zX1ZhbF9mb3JfTGFnXyIsIGkpCiAgICB9CiAgICAjIEFzc2lnbiB0aGUgbmFtZXMuIE5vdGUgdGhhdCB0aGlzIGlzIGEgbWF0cml4CiAgICBuYW1lcyhkZl9pbikgPC0gbnZlYwogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBtbSA9IHJxKGRmX2luWywxXSB+IGRmX2luWywtMV0sIHRhdSA9IHRhdSkKICAgICMgbW0gPSBycSh5MVstKDE6cCldIH4gREZfdHJpbVstKDE6cCksLShmX2FyOmxfYXIpXSArIERGX3RyaW1bLSgxOnApLChmX2FyOmxfYXIpXSArIGluZGlfbWF0WygocCsxKTpvcmlnKSxdLCB0YXUgPSB0YXUpCiAgICAjIEFkZCBhIGRpZmZlcmVudCBsaW5lIHRvIGFjY291bnQgZm9yIHRoZSBpbmRpY2F0b3IgdmFyaWFibGUKICAgICMgaW50ZXJjZXB0ICsgbSArIDIqbmxhZyB0byBhY2NvdW50IGZvciB0aGUgbnVtYmVyIG9mIGluZGljYXRvciB2YXJpYWJsZXMKICAgIGNvZWYgPSBtYXRyaXgobW0kY29lZmZpY2llbnRzLCAoMSArIG0gKyAyKnApLCAxKQogIH0KICBpZiAocHJpbnRfbWRsID09IDEpewogICAgcHJpbnQoc3VtbWFyeShtbSkpCiAgfQogICMgUHV0cyBjb2VmZmljaWVudHMgaW4gYSBtYXRyaXggLSBhZGRlZCB0aGUgQVIgdGVybXMKICAjIGNvZWYgPSBtYXRyaXgobW0kY29lZmZpY2llbnRzLCAobSArIDEpLCAxKQogIGlmIChhcl90ZiAhPSAzKXsKICAgIGNvZWYgPSBtYXRyaXgobW0kY29lZmZpY2llbnRzLCAoMSArIG0gKyBwKSwgMSkKICB9CiAgIyBJbml0aWFsaXplcyB5aGF0IHZhcmlhYmxlcyBhbmQgTVNFCiAgeWhhdCA9IE5VTEwKICBsb3NzID0gTlVMTAogIGlmIChvcmlnIDwgblQpIHsKICAgICMgQ3JlYXRlcyBhIG5mY3N0IGJ5IChtKzIpIG1hdHJpeAogICAgIyBBZGQgb24gdGhlIGxhZ2dlZCB2YXJpYWJsZXMKICAgIG5ld3ggPSBjYmluZChyZXAoMSwgKG5UIC0gb3JpZykpLCBEaW5kZXhbKG9yaWcgKyAxKTpuVCwgXSwgYWxsX2xhZ1sob3JpZysxKTpuVCxdKQogICAgIyBJbmNvcnBvcmF0ZSBsYWdnZWQgdmFyaWFibGVzCiAgICBpZiAoYXJfdGYgPT0gMyl7CiAgICAgIG5ld3ggPSBjYmluZChyZXAoMSwgKG5UIC0gb3JpZykpLCBEaW5kZXhbKG9yaWcgKyAxKTpuVCwgXSwgYWxsX2xhZ1sob3JpZysxKTpuVCxdLCBpbmRpX21hdFsob3JpZysxKTpuVCxdKQogICAgfQogICAgIyBbbmZjc3R4KG0rMSldKlsobSsxKXgxXSA9IFtuZmNzdHgxXQogICAgeWhhdCA9IG5ld3ggJSolIGNvZWYKICAgICMgQ2FsY3VsYXRlcyBlcnJvcnMKICAgIGxvc3MgPSBhYnMoc3VtKGlmZWxzZSh5WyhvcmlnICsgMSk6blRdID4geWhhdCwgdGF1LCAoLTEpKigxLXRhdSkpKSkKICAgICMgTW9kaWZ5aW5nIHRoaXMgcGFydCB0byBvbmx5IHByaW50IHRoaXMgaWYgc3BlY2lmaWVkCiAgICBpZiAocHJpbnRfbWRsID09IDEpewogICAgICBjYXQoIkxvc3NlcyBvZiBvdXQtb2Ytc2FtcGxlIGZvcmVjYXN0czogIiwgbG9zcywgIlxuIikKICAgIH0KICB9CiAgU1dmb3JlIDwtIGxpc3QoY29lZiA9IGNvZWYsIHloYXQgPSB5aGF0LCBsb3NzID0gbG9zcywgbG9hZGluZ3MgPSBNMSwgCiAgICAgIERGaW5kZXggPSBEaW5kZXgsIG5hbWVfdmVjdG9yID0gbnZlYykKfQoKYGBgCgoKCiMjIE1WIENhdmlhciAtIENhbGN1YXRpbmcgbG9zc2VzCgpgYGB7cn0KIyBEZWNpZGUgb24gdGhlIG9wdGltYWwgbnVtYmVyIG9mIHZlY3RvcnMuCgojICh5LCB4LCBvcmlnLCBtLCB0YXUpIAoKIycgRnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIGxvc3Mgb3ZlciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIGZvciB0aGUgZGlmZnVzaW9uIGluZGV4IG1vZGVsCiMnCiMnIEBwYXJhbSB5IC0gcmVzcG9uc2UgdmFyaWFibGVzCiMnIEBwYXJhbSB4IC0gZXhwbGFuYXRvcnkgdmFyaWFibGUKIycgQHBhcmFtIG9yaWcgLSBmb3JlY2FzdCBvcmlnaW4KIycgQHBhcmFtIGVuZCAtIGZvcmVjYXN0aW5nIGVuZGluZy4gTm90ZTogYXMgdGhlIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB3cml0dGVuIG9uIDIvMjQsIHRoaXMgb3B0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcuCiMnIEBwYXJhbSBtIC0gbnVtYmVyIG9mIGRpZmZ1c2lvbiBpbmRpY2VzIHRvIHVzZQojJyBAcGFyYW0gdGF1IC0gVmFSIGxldmVsCiMnIEBwYXJhbSBtb2RfZGkgLSB1c2UgdGhlIG1vZGlmaWVkIERJPwojJwojJyBAcmV0dXJuIC0gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGxvc3Mgc3VtIGFuZCB0aGUgbG9zcyB2ZWN0b3IKIycgQGV4cG9ydAojJwojJyBAZXhhbXBsZXMgLSBsb3NzX2NhbGMocGNfZGZbLDFdLCBwY19kZlssLTFdLCA3NTcsIDEwMjcsIDEsIDAuMDEpCmxvc3NfY2FsYyA9IGZ1bmN0aW9uKHksIHgsIG9yaWcsIG0sIHRhdSwgbW9kX2RpID0gMCwgYXJfdGYgPSAxLCBwID0gMSwgcHJpbnRfbWRsID0gMCwgbW9kZWwgPSAxLCBlbmQgPSBOVUxMKXsKICAjIEV4dHJhY3QgeV9oYXQgdmFsdWVzCiAgaWYgKG1vZF9kaSA9PSAwKXsKICAgIGRpID0gbW9kX2RpKHk9eSx4PXgsb3JpZz1vcmlnLG09bSwgdGF1PXRhdSwgZW5kID0gZW5kLCBwcmludF9tZGwgPSBwcmludF9tZGwpCiAgfQogIGVsc2UgewogICAgZGkgPSBtb2RfZGlfd2woeT15LHg9eCxvcmlnPW9yaWcsbT1tLCB0YXU9dGF1LCBhcl90ZiA9IGFyX3RmLCBwID0gcCwgcHJpbnRfbWRsID0gcHJpbnRfbWRsLCBtb2RlbCA9IG1vZGVsLCBlbmQgPSBlbmQpCiAgfQogICMgbW9kX2RpX3dsID0gZnVuY3Rpb24gKHksIHgsIG9yaWcsIG0sIHRhdSwgYXJfdGYgPSAxLCBwID0gMSwgcHJpbnRfbWRsID0gMCwgbW9kZWwgPSAxKQogIHloYXQgPSBkaSR5aGF0WzE6KGVuZC1vcmlnKV0KICAjIENhbGN1bGF0ZSB0aGUgbG9zcwogICMgSW5pdGlhbGl6ZSBsb3NzIHZlY3RvcgogIGx2ZWMgPSByZXAoMCwoZW5kLW9yaWcpKQogICMgVGFrZSB0aGUgZGlmZmVyZW5jZQogIGZvciAoaSBpbiAxOihlbmQtb3JpZykpewogICAgIyBDYWxjdWxhdGUgYW4gaW5kaWNhdG9yIHZhcmlhYmxlCiAgICBpbmQgPSBpZmVsc2UoeVtvcmlnK2ldIDwgeWhhdFtpXSwgMSwwKQogICAgIyBVc2UgaW5kaWNhdG9yIGluIGZ1bmN0aW9uIGJlbG93CiAgICBsdmVjW2ldID0gKHRhdSAtIGluZCkqKHlbb3JpZytpXSAtIHloYXRbaV0pCiAgfQogICMgQWRkIHVwIHRoZSBsb3NzZXMgLSBjaGFuZ2UgdG8gbG9vayBhdCBzdW0gb2YgbG9zc2VzLiBXb24ndCBjaGFuZ2UgZGVjaXNpb24gY3JpdGVyaW9uCiAgc3VtbG9zcyA9IHN1bShsdmVjKQogICMgc3VtbG9zcyA9IHN1bShsdmVjKS9sZW5ndGgobHZlYykKICByZXR1cm4obGlzdChzdW1sb3NzLGx2ZWMpKQp9CgoKYGBgCgoKCiMjIE1WIENhdmlhciAtIENob29zaW5nIHRoZSBvcHRpbWFsIG51bWJlciBvZiBwcmVkaWN0b3JzCgpgYGB7cn0KIycgRnVuY3Rpb24gdGhhdCBzZWxlY3RzIHRoZSBvcHRpbWFsIG51bWJlciBvZiBwcmVkaWN0b3JzCiMnCiMnIEBwYXJhbSB5IC0gcmVzcG9uc2UgdmVjdG9yCiMnIEBwYXJhbSB4IC0gcHJlZGljdG9yIHZhcmlhYmxlcwojJyBAcGFyYW0gb3JpZyAtIGZvcmVjYXN0IG9yaWdpbgojJyBAcGFyYW0gZW5kIC0gZW5kaW5nIG9mIHZhbGlkYXRpb24gc2V0CiMnIEBwYXJhbSB0YXUgLSBWYVIgaW4gcXVlc3Rpb24KIycgQHBhcmFtIGxvd19tIC0gbG93IHZhbHVlIG9mIG0gdG8gY29uc2lkZXIKIycgQHBhcmFtIGhpZ2hfbSAtIGhpZ2ggdmFsdWUgb2YgbSB0byBjb25zaWRlcgojJwojJyBAcmV0dXJuIC0gcmV0dXJucyB0aGUgb3B0aW1hbCB2YWx1ZSBvZiBtCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gb3B0X20ocGNfZGZbLDFdLCBwY19kZlssLTFdLCA3NTcsIDEwMjcsIDAuMDEsIGxvd19tID0xLCBoaWdoX20gID0gNSkKb3B0X20gPSBmdW5jdGlvbih5LCB4LCBvcmlnLCBlbmQgPSBOVUxMLCB0YXUsIGxvd19tID0gMSwgaGlnaF9tLCBtb2RfZGkgPSAwLCBhcl90ZiA9IDEsIHAgPSAxLCBwcmludF9tZGwgPSAwLCBtb2RlbCA9IDEsIHJvd25hbWUgPSBOVUxMKXsKICAjIEluaXRpYWxpemUgYSBsb3NzIHZlY3RvcgogIGxvc3NfdmVjID0gcmVwKDAsaGlnaF9tLWxvd19tICsgMSkKICAjIEluaXRpYWxpemUgYW4gbSB2ZWN0b3IKICBtX3ZlYyA9IHNlcShsb3dfbSwgaGlnaF9tLCBieSA9IDEpCiAgIyBMb29wIHRocm91Z2ggYW5kIHBvcHVsYXRlIHRoZSBsb3NzIHZlY3RvcgogIGZvciAoaSBpbiAxOmxlbmd0aChsb3NzX3ZlYykpewogICAgbG9zc192ZWNbaV0gPSBxdWlldChsb3NzX2NhbGMoeT15LHg9eCxvcmlnPW9yaWcsZW5kPWVuZCwgbSA9IG1fdmVjW2ldLCB0YXUgPSB0YXUsIG1vZF9kaSA9IG1vZF9kaSwgYXJfdGYgPSBhcl90ZiwgcCA9IHAsIHByaW50X21kbCA9IHByaW50X21kbCwgbW9kZWwgPSBtb2RlbCkpW1sxXV0KICB9CiAgIyBGaW5kIHRoZSBtaW5pbWl6ZXIKICBvcHRfbSA9IHdoaWNoLm1pbihsb3NzX3ZlYykKICBvcHRfcCA9IE5BCiAgIyBDb21iaW5lIGludG8gYSBkYXRhIGZyYW1lCiAgZGYgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKG9wdF9tLCBvcHRfcCkpCiAgbmFtZXMoZGYpIDwtIGMoIk9wdGltYWwgbSIsICJPcHRpbWFsIHAiKQogICMgQXNzaWduIGEgcm93bmFtZQogIGlmIChpcy5udWxsKHJvd25hbWUpID09IFRSVUUpewogICAgIyBXcml0ZSB0aGUgcm93IG5hbWVzCiAgICByb3duYW1lcyhkZikgPC0gYygiTVYgQ0FWaWFSIikKICB9CiAgZWxzZSB7CiAgICByb3duYW1lcyhkZikgPC0gcm93bmFtZQogIH0KICAjIFJldHVybiB0aGUgbG9zc192ZWN0b3IgYW5kIHRoZSBtaW5pbXplcgogIHJldHVybihsaXN0KG9wdF9tLCBsb3NzX3ZlYywgZGYpKQp9CmBgYAoKYGBge3J9CiMnIEZ1bmN0aW9uIHRoYXQgc2VsZWN0cyB0aGUgb3B0aW1hbCBudW1iZXIgb2YgbGFncwojJwojJyBAcGFyYW0geSAtIHJlc3BvbnNlIHZlY3RvcgojJyBAcGFyYW0geCAtIHByZWRpY3RvciB2YXJpYWJsZXMKIycgQHBhcmFtIG9yaWcgLSBmb3JlY2FzdCBvcmlnaW4KIycgQHBhcmFtIGVuZCAtIGVuZGluZyBvZiB2YWxpZGF0aW9uIHNldAojJyBAcGFyYW0gdGF1IC0gVmFSIGluIHF1ZXN0aW9uCiMnIEBwYXJhbSBsb3dfbSAtIGxvdyB2YWx1ZSBvZiBtIHRvIGNvbnNpZGVyCiMnIEBwYXJhbSBoaWdoX20gLSBoaWdoIHZhbHVlIG9mIG0gdG8gY29uc2lkZXIKIycKIycgQHJldHVybiAtIHJldHVybnMgdGhlIG9wdGltYWwgdmFsdWUgb2YgbQojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIG9wdF9tcCh5ID0gcGNfZGZbLDFdLCB4ID0gcGNfZGZbLC0xXSwgb3JpZyA9IDc1NywgZW5kID0gMTAwNywgdGF1ID0gMC4wMSwgbG93X20gPTEsIGhpZ2hfbSAgPSA1LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCBhcl90ZiA9IDIsIG1vZF9kaSA9IDEpCm9wdF9tcCA9IGZ1bmN0aW9uKHksIHgsIG9yaWcsIGVuZCA9IE5VTEwsIHRhdSwgbG93X20gPSAxLCBoaWdoX20sIGxvd19wID0gMSwgaGlnaF9wLCBtb2RfZGkgPSAwLCBhcl90ZiA9IDEsIHByaW50X21kbCA9IDAsIG1vZGVsID0gMSwgcHJpbnRfbXAgPSAwLCByb3duYW1lID0gTlVMTCl7CiAgIyBJbml0aWFsaXplIGEgbG9zcyBtYXRyaXgKICBsb3NzX21hdCA9IG1hdHJpeCgwLCBoaWdoX3AtbG93X3AgKyAxLGhpZ2hfbS1sb3dfbSArIDEpCiAgIyBJbml0aWFsaXplIGEgcCB2ZWN0b3IKICBwX3ZlYyA9IHNlcShsb3dfcCwgaGlnaF9wLCBieSA9IDEpCiAgIyBMb29wIHRocm91Z2ggYW5kIHBvcHVsYXRlIHRoZSBsb3NzIHZlY3RvcgogIGZvciAoaSBpbiAxOm5yb3cobG9zc19tYXQpKXsKICAgIGxvc3NfbWF0W2ksXSA9IG9wdF9tKHkgPSB5LCB4ID0geCwgb3JpZyA9IG9yaWcsIGVuZCA9IGVuZCwgdGF1ID0gdGF1LCBsb3dfbSA9IGxvd19tLCBoaWdoX20gID0gaGlnaF9tLCBwID0gaSwgbW9kX2RpID0gbW9kX2RpLCBhcl90ZiA9IGFyX3RmLCBwcmludF9tZGwgPSBwcmludF9tZGwsIG1vZGVsID0gbW9kZWwpW1syXV0KICB9CiAgIyBGaW5kIHRoZSBtaW5pbWl6ZXIKICBvcHRfcCA9IHdoaWNoKGxvc3NfbWF0ID09IG1pbihsb3NzX21hdCksIGFyci5pbmQgPSBUUlVFKVsxLDFdCiAgb3B0X20gPSB3aGljaChsb3NzX21hdCA9PSBtaW4obG9zc19tYXQpLCBhcnIuaW5kID0gVFJVRSlbMSwyXQogICMgUHJpbnQgdGhlIG9wdGltYWwgcCBhbmQgb3B0aW1hbCBtCiAgZGYgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKG9wdF9tLCBvcHRfcCkpCiAgbmFtZXMoZGYpIDwtIGMoIk9wdGltYWwgbSIsICJPcHRpbWFsIHAiKQogICMgQXNzaWduIGEgcm93bmFtZQogIGlmIChpcy5udWxsKHJvd25hbWUpID09IFRSVUUpewogICAgaWYgKGFyX3RmID09IDEpewogICAgICAjIFdyaXRlIHRoZSByb3cgbmFtZXMKICAgICAgcm93bmFtZXMoZGYpIDwtIGMoIk1WIENBVmlhUiArIEFSIikKICAgIH0gZWxzZSBpZiAoYXJfdGYgPT0gMil7CiAgICAgICMgV3JpdGUgdGhlIHJvdyBuYW1lcwogICAgICByb3duYW1lcyhkZikgPC0gYygiTVYgQ0FWaWFSICsgU0FWIikKICAgIH0gZWxzZSBpZiAoYXJfdGYgPT0gMyl7CiAgICAgICMgV3JpdGUgdGhlIHJvdyBuYW1lcwogICAgICByb3duYW1lcyhkZikgPC0gYygiTVYgQ0FWaWFSICsgQVMiKQogICAgfSBlbHNlIHsKICAgICAgcm93bmFtZXMoZGYpIDwtIGMoIlVua25vd24gTW9kZWwiKQogICAgfQogIH0KICBlbHNlIHsKICAgIHJvd25hbWVzKGRmKSA8LSByb3duYW1lCiAgfQogICMgUHJpbnQgdGhlIGRmIGlmIHRoZSBvcHRpb24gaXMgdHVybmVkIG9uCiAgaWYgKHByaW50X21wID09IDEpewogICAgcHJpbnQoZGYpCiAgfQogICMgUmV0dXJuIHRoZSBsb3NzX3ZlY3RvciBhbmQgdGhlIG1pbmltemVyCiAgcmV0dXJuKGxpc3Qob3B0X20sIG9wdF9wLCBsb3NzX21hdCwgZGYpKQp9CmBgYAoKCmBgYHtyfQojJyBBIGZ1bmN0aW9uIHRoYXQgY29tYmluZXMgb3B0aW1hbCB2YWx1ZXMgb2YgbSBhbmQgcCBpbnRvIGEgZmluYWwgdGFibGUKIycKIycgQHBhcmFtIG0xIC0gdGhlIGRhdGEgZnJhbWUgZnJvbSB0aGUgIk1WIENBVmlhUiIgcnVuCiMnIEBwYXJhbSBtMiAtIHRoZSBkYXRhIGZyYW1lIGZyb20gdGhlICJNViBDQVZpYVIgKyBBUiIgcnVuCiMnIEBwYXJhbSBtMyAtIHRoZSBkYXRhIGZyYW1lIGZyb20gdGhlICJNViBDQVZpYVIgKyBTQVYiIHJ1bgojJyBAcGFyYW0gbTQgLSB0aGUgZGF0YSBmcmFtZSBmcm9tIHRoZSAiTVYgQ0FWaWFSICsgQVMiIHJ1bgojJwojJyBAcmV0dXJuIC0gYSBuaWNlbHkgZm9ybWF0dGVkIHRhYmxlCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzIC0gcHJldHR5X3BtKG9wdF9wcmVkX25sW1szXV0sIG9wdF9wbV9tMVtbNF1dLCBvcHRfcG1fbTJbWzRdXSwgb3B0X3BtX20zW1s0XV0pCnByZXR0eV9wbSA9IGZ1bmN0aW9uKG0xLCBtMiwgbTMsIG00KXsKICAjIE1lcmdlIHRoZSBpbmRpdmlkdWFsIGRhdGEgZnJhbWVzCiAgcG1fcHJldHR5X2RmID0gcmJpbmQobTEsIG0yLCBtMywgbTQpCiAgIyBGb3JtYXQgbmljZWx5CiAgcG1fcHJldHR5X2RmICU+JSBrYWJsZShjYXB0aW9uID0gIk9wdGltYWwgTnVtYmVyIG9mIERpZmZ1c2lvbiBJbmRpY2VzIChtKSBhbmQgTGFncyAocCkgZm9yIERpZmZlcmVudCBNb2RlbHMiLCBkaWdpdHMgPSAwKSAlPiUga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUga2FibGVfc3R5bGluZygpICU+JSBmb290bm90ZShnZW5lcmFsID0gIlRoZSBNViBDQVZpYVIgbW9kZWwgZG9lc24ndCBoYXZlIGFuIG9wdGltYWwgdmFsdWUgZm9yIHAgYmVjYXVzZSB0aGVyZSBhcmUgbm8gQVIgbGFncyBpbiB0aGUgbW9kZWwiCiAgKQogIAp9CgpgYGAKCgojIyBNViBDYXZpYXIgLSBSdW5uaW5nIHRoZSB1bml2YXJpYXRlIG1vZGVsIG11bHRpcGxlIHRpbWVzCgpgYGB7cn0KIycgSGVyZSBpcyBhIGZ1bmN0aW9uIHRoYXQgcnVucyB0aGUgdW5pdmFyaWF0ZSBDQVZpYVIgbW9kZWwgNCB0aW1lcwojJwojJyBAcGFyYW0gZGYgLSB0aGUgcGVyY2VudCBjaGFuZ2UgZGF0YSBmcmFtZSB0byBjb25zaWRlcgojJyBAcGFyYW0gbmZjc3QgLSBudW1iZXIgb2YgZm9yZWNhc3RzIHRvIHJ1bgojJyBAcGFyYW0gdGF1IC0gdGhlIFZhUiBsZXZlbCB0byBjb25zaWRlcgojJyBAcGFyYW0gbm9fcnVuIC0gc3BlY2lmaWVzIGlmIGFueSBtb2RlbHMgc2hvdWxkIG5vdCBiZSBydW4KIycKIycgQHJldHVybiAtIGEgbGlzdCBvZiB0aGUgNCB1bml2YXJpYXRlIG1vZGVsIGZvcmVjYXN0cwojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcyAtIGFjZWcgPSBnZW5fdXZfdGVzdChwY19kZiwgMSwgMC4wNSwgbm9fcnVuID0gYygxLDEsMCwxKSkKZ2VuX3V2X3Rlc3QgPSBmdW5jdGlvbihkZiwgbmZjc3QsIHRhdSwgbm9fcnVuID0gYygwLDAsMCwwKSl7CiAgIyBtb2RlbCB0eXBlICgxIC0gU0FWLCAyIC0gQVMsIDMgLSBHQVJDSCwgNCAtIEFEQVBUSVZFKSAKICAjIEluaXRpYWxpemUgYSBsaXN0ICAKICBvdXRfbGlzdCA9IGxpc3QoKQogICMgUnVuIHRoZSBmb3VyIG1vZGVscyAtIG1vZGVsIDE7IFNBVgogIGlmIChub19ydW5bMV0gPT0gMCl7CiAgICB1dmNhdl8xID0gcm9sbGluZ19wcmVkaWN0aW9ucyhkZlssMV0sIHJhbmdlX2RhdGEgPSAoMTpsZW5ndGgoZGZbLDFdKSksIG5mY3N0ID0gbmZjc3QsIG1vZGVsID0gMSwgRyA9IDEwLCBjb2wgPSAxLCBsZXZlbCA9IHRhdSkKICB9CiAgIyBBZGQgYSBmaWxsZXIgaWYgdGhlcmUncyBubyBlbnRyeQogIGVsc2UgewogICAgdXZjYXZfMSA9IDAKICB9CiAgIyBNb2RlbCAyIC0gQVMKICBpZiAobm9fcnVuWzJdID09IDApewogICAgdXZjYXZfMiA9IHJvbGxpbmdfcHJlZGljdGlvbnMoZGZbLDFdLCByYW5nZV9kYXRhID0gKDE6bGVuZ3RoKGRmWywxXSkpLCBuZmNzdCA9IG5mY3N0LCBtb2RlbCA9IDIsIEcgPSAxMCwgY29sID0gMSwgbGV2ZWwgPSB0YXUpCiAgfQogIGVsc2UgewogICAgdXZjYXZfMiA9IDAKICB9CiAgIyBNb2RlbCAzIC0gR0FSQ0gKICBpZiAobm9fcnVuWzNdID09IDApewogICAgdXZjYXZfMyA9IHJvbGxpbmdfcHJlZGljdGlvbnMoZGZbLDFdLCByYW5nZV9kYXRhID0gKDE6bGVuZ3RoKGRmWywxXSkpLCBuZmNzdCA9IG5mY3N0LCBtb2RlbCA9IDMsIEcgPSAxMCwgY29sID0gMSwgbGV2ZWwgPSB0YXUpCiAgfQogIGVsc2UgewogICAgdXZjYXZfMyA9IDAKICB9CiAgIyBNb2RlbCA0IC0gQWRhcHRpdmUKICBpZiAobm9fcnVuWzRdID09IDApewogICAgdXZjYXZfNCA9IHJvbGxpbmdfcHJlZGljdGlvbnMoZGZbLDFdLCByYW5nZV9kYXRhID0gKDE6bGVuZ3RoKGRmWywxXSkpLCBuZmNzdCA9IG5mY3N0LCBtb2RlbCA9IDQsIEcgPSAxMCwgY29sID0gMSwgbGV2ZWwgPSB0YXUpCiAgfQogIGVsc2UgewogICAgdXZjYXZfNCA9IDAKICB9CiAgIyBFeHBvcnQgdGhlIGRhdGEgYXMgYSBsaXN0CiAgcmV0dXJuKGxpc3QodXZjYXZfMSwgdXZjYXZfMiwgdXZjYXZfMywgdXZjYXZfNCkpCn0KCmBgYAoKCgojIyBNViBDYXZpYXIgLSBQbG90dGluZyBmdW5jdGlvbgoKYGBge3J9CiMnIEZ1bmN0aW9uIHRvIHBsb3QgdGhlIGRhdGEgd2hpY2ggd2UgZ2VuZXJhdGUgaW4gcHJldmlvdXMgZnVuY3Rpb25zCiMnCiMnIEBwYXJhbSBwbG90X21hdHJpeCAtIG1hdHJpeCB3aXRoIHRoZSBkYXRhIHRvIHBsb3QKIycgQHBhcmFtIG5vcm1fdmFsdWUgLSB3aGF0IHRvIHN1YnRhY3QgZnJvbSB0aGUgZGF0YSB0byBtYWtlIGl0IG9uIGEgcGVyY2VudGFnZSBjaGFuZ2UgYmFzaXMuIERlZmF1bHQgaXMgMTAwLgojJwojJyBAcmV0dXJuIAojJyBAZXhwb3J0IC0gYSBwbG90IG9mIHRoZSBkYXRhIGJ5IGRpZmZ1c2lvbiBpbmRleCBudW1iZXIKIycKIycgQGV4YW1wbGVzID0gcGx0X2RhdGEocGxvdF9tdHhbWzFdXSksIGFiYyA9IHBsdF9kYXRhKHBsb3RfbWF0LCB0YXUgPSAwLjAxKQpwbHRfZGF0YSA9IGZ1bmN0aW9uKHBsb3RfbWF0cml4LCB0YXUsIHJlc3BfdmFyLCBudGVzdCl7CiAgIyBFc3RhYmxpc2ggYSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlCiAgbWF4X3ZhbCA9IG1heChwbG90X21hdHJpeFssMTpuY29sKHBsb3RfbWF0cml4KV0pCiAgbWluX3ZhbCA9IG1pbihwbG90X21hdHJpeFssMTpuY29sKHBsb3RfbWF0cml4KV0pCiAgIyBDYWxjdWxhdGUgaW5pdGFsIGFuZCBlbmRpbmcgdGltZSB2YWx1ZQogIHN0YXJ0ID0gaW5kZXgocGxvdF9tYXRyaXgpWzFdCiAgZW5kID0gaW5kZXgocGxvdF9tYXRyaXgpW25yb3cocGxvdF9tYXRyaXgpXQogIGluZF92YWxzID0gaW5kZXgocGxvdF9tYXRyaXgpIC0gc3RhcnQKICAjIENyZWF0ZSBhbiBpbml0aWFsIHBsb3QgYW5kIGFkZCBsaW5lcwogICAgZm9yIChpIGluIDE6bmNvbChwbG90X21hdHJpeCkpewogICAgICBpZiAoaSA9PSAxKXsKICAgICAgICAjIDQvMi8yMDIwIC0gZml4aW5nIHRoZSBpbmRleAogICAgICAgIHBsb3QudHMoaW5kX3ZhbHMscGxvdF9tYXRyaXhbLGldLCB0eXBlID0gImwiLCB4bGFiID0gcGFzdGUoIkRheXMgU2luY2UiLCBhcy5EYXRlKHN0YXJ0KSksIHlsYWIgPSAiUGVyY2VudCBDaGFuZ2UgaW4gUEciLCB5bGltID0gYyhtaW5fdmFsLG1heF92YWwpLCBsd2QgPSAxLCBtYWluID0gcGFzdGUoIlByZWRpY3RpbmciLCByZXNwX3ZhciwgIlJldHVybnMgZnJvbSIsIGFzLkRhdGUoc3RhcnQpLCAidG8iLCBhcy5EYXRlKGVuZCkpLCBzdWIgPSBwYXN0ZSgiVGhlIFZhUiBMZXZlbCBpcyAiLCAxMDAqdGF1LCAiJSIsICI7IFRoZXJlIGFyZSAiLCBudGVzdCwgIiBUcmFkaW5nIERheXMgUGxvdHRlZCBBYm92ZSIsIHNlcCA9ICIiKSkKICAgICAgICAjIHBsb3QudHMoaW5kZXgocGxvdF9tYXRyaXgpLCBwbG90X21hdHJpeFssaV0sIHR5cGUgPSAibCIsIHhsYWIgPSAiVHJhZGluZyBEYXlzIiwgeWxhYiA9ICJQZXJjZW50IENoYW5nZSBpbiBQRyIsIHlsaW0gPSBjKG1pbl92YWwsbWF4X3ZhbCksIGx3ZCA9IDEsIG1haW4gPSAiUHJlZGljdGluZyBQRyBSZXR1cm5zIE92ZXIgTGFzdCAyNTAgVHJhZGluZyBEYXlzIGluIDIwMDgiLCBzdWIgPSBwYXN0ZSgiVGhlIFZhUiBMZXZlbCBpcyAiLCAxMDAqdGF1LCAiJSIsIHNlcCA9ICIiKSkKICAgIH0gZWxzZSBpZihpICVpbiUgc2VxKDIsOCwxKSkgewogICAgICAgIGxpbmVzKGluZF92YWxzLHBsb3RfbWF0cml4WyxpXSwgY29sID0gaS0xLCBsdHkgPSAyKQogICAgfSBlbHNlIHsKICAgICAgICBsaW5lcyhpbmRfdmFscyxwbG90X21hdHJpeFssaV0sIGNvbCA9IGktMSwgbHR5ID0gMiwgbHdkID0gMikKICAgIH0KICAgIH0KICAjIERlZmluZSBhIHNlcXVlbmNlIGZvciBwbG90dGluZwogIHBsb3Rfc2VxID0gc2VxKDEsIG5jb2wocGxvdF9tYXRyaXgpKQogIGxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoY29sbmFtZXMocGxvdF9tYXRyaXgpKSwgY29sID0gcGxvdF9zZXEsIGx0eSA9IGMoMSwgcmVwKDIsIDcpLCByZXAoMywgaWZlbHNlKG5jb2wocGxvdF9tYXRyaXgpLTggPD0gMCwgMCwgbmNvbChwbG90X21hdHJpeCktOCkpKSwgbHdkID0gYygxLCByZXAoMSwgNyksIHJlcCgyLCBpZmVsc2UobmNvbChwbG90X21hdHJpeCktOCA8PSAwLCAwLCBuY29sKHBsb3RfbWF0cml4KS04KSkpKQogICMgQWRkIGEgbGluZSBmb3IgMAogICMgYWJsaW5lKGggPSAwLCBjb2wgPSAiYmxhY2siLCBsdHkgPSAyKQp9CgoKYGBgCgojIyBNViBDYXZpYXIgLSBPbGQgTG9zcyBUZXN0IEZ1bmN0aW9uCgpgYGB7cn0KIycgQSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgbG9zc2VzIGJhc2VkIG9uIHRoZSB0ZXN0IHNhbXBsZQojJwojJyBAcGFyYW0gdHJ1ZV92ZWMgLSB0aGUgdHJ1ZSB2ZWN0b3Igb2YgcmV0dXJucwojJyBAcGFyYW0gcHJlZF92ZWMgLSB0aGUgcHJlZGljdGVkIHZlY3RvciBmcm9tIHRoZSBtb2RlbCBydW5zCiMnIEBwYXJhbSB0YXUgLSBWYVIgbGV2ZWwuIE11c3QgbWF0Y2ggd2hhdCB0aGUgbW9kZWwgdXNlZAojJwojJyBAcmV0dXJuIC0gdG90YWwgbG9zc2VzIGFuZCB0aGUgZW50aXJlIGxvc3MgdmVjdG9yCiMnIEBleHBvcnQKIycKIycgQGV4YW1wbGVzCmxvc3NfdGVzdCA9IGZ1bmN0aW9uKHRydWVfdmVjLCBwcmVkX3ZlYywgdGF1KXsKICAjIEluaXRpYWxpemUgYSBsb3NzIHZlY3RvcgogIGx2ZWMgPSByZXAoMCwgbGVuZ3RoKHRydWVfdmVjKSkKICAjIEluaXRpYWxpemUgYSBicmVhayB2ZWN0b3IgdG8gc2VlIHdoZW4gVmFSIGlzIGJyb2tlbgogIGJ2ZWMgPSByZXAoMCwgbGVuZ3RoKHRydWVfdmVjKSkKICBmb3IgKGkgaW4gMTpsZW5ndGgodHJ1ZV92ZWMpKXsKICAgICMgQ2FsY3VsYXRlIGFuIGluZGljYXRvciB2YXJpYWJsZQogICAgYnZlY1tpXSA9IGlmZWxzZSh0cnVlX3ZlY1tpXSA8IHByZWRfdmVjW2ldLCAxLDApCiAgICAjIFVzZSBpbmRpY2F0b3IgaW4gZnVuY3Rpb24gYmVsb3cKICAgIGx2ZWNbaV0gPSAodGF1IC0gYnZlY1tpXSkqKHRydWVfdmVjW2ldIC0gcHJlZF92ZWNbaV0pCiAgfQogICMgQWRkIHVwIHRoZSBsb3NzZXMKICAjIHN1bWxvc3MgPSBzdW0obHZlYykvbGVuZ3RoKGx2ZWMpCiAgc3VtbG9zcyA9IHN1bShsdmVjKQogICMgQWRkIHVwIHRoZSBWYVIgYnJlYWthZ2UKICB2YXJicmVhayA9IHN1bShidmVjKS9sZW5ndGgoYnZlYykKICByZXR1cm4obGlzdChzdW1sb3NzLGx2ZWMsIHZhcmJyZWFrLCBidmVjKSkKfQpgYGAKCgoKIyMgTVYgQ2F2aWFyIC0gQSBnZW5lcmFsaXplZCBsb3NzIGNhbGN1bGF0aW9uIGZ1bmN0aW9uCgpgYGB7cn0KIycgQSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgbG9zc2VzIGJhc2VkIG9uIHRoZSBwbG90IG1hdHJpeAojJwojJyBAcGFyYW0gZGF0YV9tYXQgLSBhIG1hdHJpeCBvZiBmb3JlY2FzdGVkIFZhUiB2YWx1ZXMsIHdpdGggdGhlIHRydWUgdmFsdWUgaW4gdGhlIGZpcnN0IGNvbHVtbgojJyBAcGFyYW0gdGF1IC0gVmFSIGxldmVsLiBNdXN0IG1hdGNoIHdoYXQgdGhlIG1vZGVsIHVzZWQKIycKIycgQHJldHVybiAtIGEgbGlzdCBvZiBmb3VyIGl0ZW1zLiAKIycgMSA9IGEgdmVjdG9yIG9mIHRoZSBsb3NzZXMgb2YgYWxsIG1vZGVscy4gCiMnIDIgPSBhIHZlY3RvciBzaG93aW5nIHRoZSBwZXJjZW50YWdlIG9mIFZhUiBicmVha3MgYnkgbW9kZWwKIycgMyA9IHRoZSBsb3NzIG1hdHJpeAojJyA0ID0gdGhlIGJyZWFrIG1hdHJpeAojJyBAZXhwb3J0CiMnCiMnIEBleGFtcGxlcwpnZW5fbG9zc190ZXN0ID0gZnVuY3Rpb24oZGF0YV9tYXQsIHRhdSl7CiAgIyBJbml0aWFsaXplIGxvc3MgYW5kIGJyZWFrIG1hdHJpY2VzCiAgbG1hdCA9IGJtYXQgPSBtYXRyaXgoMCwgbnJvdyA9IG5yb3coZGF0YV9tYXQpLCBuY29sID0gbmNvbChkYXRhX21hdCktMSkKICAjIGJ2ZWMgPSByZXAoMCwgbGVuZ3RoKHRydWVfdmVjKSkKICAjIFBvcHVsYXRlIHRoZSBtYXRyaWNlcwogIGZvciAoaSBpbiAxOm5yb3cobG1hdCkpewogICAgZm9yIChqIGluIDE6KG5jb2wobG1hdCkpKXsKICAgICAgIyBDYWxjdWxhdGUgYW4gaW5kaWNhdG9yIHZhcmlhYmxlCiAgICAgIGJtYXRbaSxqXSA9IGlmZWxzZShkYXRhX21hdFtpLDFdIDwgZGF0YV9tYXRbaSxqKzFdLCAxLDApCiAgICAgICMgVXNlIGluZGljYXRvciBpbiBmdW5jdGlvbiBiZWxvdwogICAgICBsbWF0W2ksal0gPSAodGF1IC0gYm1hdFtpLGpdKSooZGF0YV9tYXRbaSwxXSAtIGRhdGFfbWF0W2ksaisxXSkKICAgIH0gICAgCiAgfQogICMgQWRkIHVwIHRoZSBsb3NzZXMKICBzdW1sb3NzID0gY29sU3VtcyhsbWF0KQogICMgQWRkIHVwIHRoZSBWYVIgYnJlYWthZ2UKICB2YXJicmVhayA9IGNvbFN1bXMoYm1hdCkvbnJvdyhibWF0KQogIHJldHVybihsaXN0KHN1bWxvc3MsIHZhcmJyZWFrLCBsbWF0LCBibWF0KSkKfQpgYGAKCgojIyBNViBDYXZpYXIgLSBUYWJsZXMgZnVuY3Rpb24KCmBgYHtyfQojJyBBIGZ1bmN0aW9uIHRvIG1ha2UgYSBuaWNlIGNvbXBhcmlzb24gb2YgbG9zc2VzCiMnCiMnIEBwYXJhbSBkYXRhX21hdCAtIGlucHV0IGRhdGEgbWF0cml4IHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIGxvc3NlcwojJyBAcGFyYW0gbG9zc19saXN0IC0gYSBsaXN0IG9mIHRoZSBsb3NzZXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBDQVZpYVIgZnVuY3Rpb24KIycgQHBhcmFtIHRhdSAtIHRoZSByaXNrIGxldmVsIHVzZWQKIycgQHBhcmFtIG50ZXN0IC0gdGhlIG51bWJlciBvZiB0ZXN0IHBvaW50cwojJwojJyBAcmV0dXJuCiMnIEBleHBvcnQgLSByZXR1cm5zIGEgbmljZWx5IGZvcm1hdHRlZCB0YWJsZQojJwojJyBAZXhhbXBsZXMgLSBwcmV0dHlfdGFibGVzKHBsb3RfbWF0LCBsX2xpc3QsIHRhdSA9IDAuMDEpCnByZXR0eV90YWJsZXMgPSBmdW5jdGlvbihkYXRhX21hdCwgbG9zc19saXN0LCB0YXUsIG50ZXN0KXsKICAjIENvbWJpbmUgaW50byBhIGRhdGEgZnJhbWUKICBkZiA9IGFzLmRhdGEuZnJhbWUocmJpbmQobG9zc19saXN0W1sxXV0sIGxvc3NfbGlzdFtbMl1dKSkKICAjIENhbGN1bGF0ZSBpbml0YWwgYW5kIGVuZGluZyB0aW1lIHZhbHVlCiAgc3RhcnQgPSBpbmRleChkYXRhX21hdClbMV0KICBlbmQgPSBpbmRleChkYXRhX21hdClbbnJvdyhkYXRhX21hdCldCiAgIyBBZGQgcm93L2NvbHVtbiBuYW1lcwogIGNvbG5hbWVzKGRmKSA8LSBjb2xuYW1lcyhkYXRhX21hdFssLTFdKQogIHJvd25hbWVzKGRmKSA8LSBjKCJMb3NzZXMiLCAiVmFSIEJyZWFrcyAoJSkiKQogICMgQ29udmVydCB0byBhIHRhYmxlCiAgZGYgJT4lIGthYmxlKGNhcHRpb24gPSBwYXN0ZSgiQ29tcGFyaXNvbiBvZiBWYVIgTWV0aG9kcyBmb3IgYSAiLCB0YXUqMTAwLCAiJSBWYVIiLCBzZXAgPSAiIiksIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JSBrYWJsZV9zdHlsaW5nKCkgJT4lIGZvb3Rub3RlKGdlbmVyYWwgPSBwYXN0ZSgiQ2FsY3VsYXRlZCB1c2luZyIsIG50ZXN0LCAidHJhZGluZyBkYXlzIGZyb20iLCBhcy5EYXRlKHN0YXJ0KSwgInRvIiwgYXMuRGF0ZShlbmQpKSkKfQpgYGAKCgoKCiMjIEV4cG9ydCBmdW5jdGlvbgoKCgoKYGBge3J9CiMnIEEgZHJlc3NlZCB1cCB2ZXJzaW9uIG9mIHRoZSBleHBvcnQgZnVuY3Rpb24KIycKIycgQHBhcmFtIHZhcl9maWxlIC0gZmlsZSB0byBleHBvcnQKIycgQHBhcmFtIHBhdGggLSBmaWxlcGF0aAojJyBAcGFyYW0gZmlsZW5hbWUgLSBuYW1lIG9mIHRoZSBmaWxlLCBlbmRpbmcgd2l0aCAuQ1NWCiMnCiMnIEByZXR1cm4KIycgQGV4cG9ydCAtIGV4cG9ydGVkIENTViBmaWxlCiMnCiMnIEBleGFtcGxlcyAtIGV4cF9mdW5jKHZhcl9maWxlID0gdmFyXzFwY18yMDE2X3VzZXRmW1sxXV0sIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJURVNULmNzdiIpCmV4cF9mdW5jID0gZnVuY3Rpb24odmFyX2ZpbGUsIHBhdGgsIGZpbGVuYW1lKXsKICAjIFdyaXRlIGEgem9vCiAgd3JpdGUuem9vKHZhcl9maWxlLCBwYXN0ZTAocGF0aCwgZmlsZW5hbWUpLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiLCIpCn0KCiMgZXhwX2Z1bmModmFyX2ZpbGUgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gIlRFU1QuY3N2IikKCmBgYAoKCgoKIyBCaWcgU2ltdWxhdGlvbiBGdW5jdGlvbgoKYGBge3J9CiMnIFRoaXMgaXMgdGhlICJtYXN0ZXIiIGZ1bmN0aW9uIHdoZXJlIHdlJ2xsIGV2YWx1YXRlIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBWYVIgbW9kZWwgb3ZlciBzZXZlcmFsIHRpbWUgcGVyaW9kcwojJwojJyBAcGFyYW0gc3ltYm9sX2xpc3QgLSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBmZWVkIGludG8gdGhlIG1vZGVsIAojJyBAcGFyYW0gcmVzcF92YXIgLSB0aGUgcmVzcG9uc2UgdmFyaWFibGUKIycgQHBhcmFtIGNvbXBsX2Nhc2UgLSBzaG91bGQgdGhlIG1vZGVsIHJlcXVpcmUgY29tcGxldGUgY2FzZXM/IERlZmF1bHQgdmFsdWUgaXMgMS4KIycgQHBhcmFtIGFkal9jbG9zZSAtIHVzZSBhZGp1c3RlZCBjbG9zZSBwcmljZSBmb3IgdGhlIHByZWRpY3RvcnM/IERlZmF1bHQgdmFsdWUgaXMgMS4KIycgQHBhcmFtIHJlc3BfYWRqX2Nsb3NlIC0gdXNlIGFkanVzdGVkIGNsb3NlIHByaWNlIGZvciB0aGUgcmVzcG9uc2U/IERlZmF1bHQgdmFsdWUgaXMgMS4KIycgQHBhcmFtIHN0YXJ0X2RhdGUgLSBzdGFydCBkYXRlIHRvIHB1bGwgZGF0YSBmcm9tCiMnIEBwYXJhbSBlbmRfZGF0ZSAtIGVuZCBkYXRlIHRvIHB1bGwgZGF0YSBmcm9tCiMnIEBwYXJhbSBudmFsIC0gbnVtYmVyIG9mIHZhbGlkYXRpb24gcG9pbnRzIHRvIHVzZQojJyBAcGFyYW0gbnRlc3QgLSBudW1iZXIgb2YgdGVzdCBwb2ludHMgdG8gdXNlCiMnIEBwYXJhbSB0YXUgLSBWYVIgbGV2ZWwgdG8gdXNlCiMnIEBwYXJhbSBsb3dfbSAtIGxvdyBudW1iZXIgb2YgcHJlZGljdG9ycyB0byB0ZXN0CiMnIEBwYXJhbSBoaWdoX20gIC0gbG93IG51bWJlciBvZiBwcmVkaWN0b3JzIHRvIHRlc3QKIycgQHBhcmFtIHV2X2xpc3QgLSBhIGxpc3Qgb2YgYSBwcmUtcnVuIHVuaXZhcmlhdGUgbW9kZWwuIElmIGEgZGF0YSBmcmFtZSBpcyBub3QgcHJvdmlkZWQsIHRoZSBsZW5ndGh5IHV2IG1vZGVsIHdpbGwgcnVuIAojJyBAcGFyYW0gbm9fcnVuIC0gdGhpbmdzIG5vdCB0byBydW4gaW4gdGhlIG1vZGVsCiMnIEBwYXJhbSBsb3dfcCAtIGxvdyB2YWx1ZSBmb3IgbnVtYmVyIG9mIGxhZ3MKIycgQHBhcmFtIGhpZ2hfcCAtIGhpZ2ggdmFsdWUgZm9yIG51bWJlciBvZiBsYWdzCiMnIEBwYXJhbSBuYV9pbnRlcnAgLSBzaG91bGQgdGhlIGZ1bmN0aW9uIGludGVycG9sYXRlIE5BJ3MKIycgQHBhcmFtIHByaW50X21kbCAtIHByaW50IHRoZSBtb2RlbCBzdW1tYXJpZXM/CiMnIEBwYXJhbSBwcmludF9tcCAtIHByaW50IHRoZSBvcHRpbWFsIHZhbHVlcyBmb3IgcCBhbmQgbQojJyBAcGFyYW0gbGFnX3ByZWQgLSBkbyB5b3Ugd2FudCB0byBsYWcgdGhlIG0gcHJlZGljdG9ycyAoZGVmYXVsdCBpcyAxOyBzdHJvbmdseSByZWNvbW1lbmRlZCkKIycgQHBhcmFtIHJvd25hbWUgLSB3aGF0IHRvIG5hbWUgdGhlIHJvd3Mgb2YgdGhlIG5pY2UgcCBhbmQgbSBtYXRyaXgKIycgQHBhcmFtIGV4cG9ydF9jc3YgLSBkbyB5b3Ugd2FudCB0byBleHBvcnQgYSBDU1Y/IERlZmF1bHQgaXMgMS4KIycgQHBhcmFtIHBhdGggLSBwYXRoIHRvIGV4cG9ydCB0aGUgQ1NWCiMnIEBwYXJhbSBmaWxlbmFtZSAtIHdoYXQgdG8gbmFtZSB0aGUgQ1NWCiMnCiMnIEByZXR1cm4gLSBhIGxpc3Qgb2YgdGhlIHBsb3QgbWF0cml4LCBhIHBsb3QsIGEgbGlzdCB3aXRoIGxvc3NlcywgYW5kIGEgdGFibGUKIycgQGV4cG9ydCAtIGEgcGxvdCBhbmQgYSB0YWJsZQojJwojJyBAZXhhbXBsZXMgLSBjYXZfc2ltdWwoYygiRElTIiwgIkdFIiwgIklCTSIsICJNTU0iLCAiWE9NIiksIHJlc3BfdmFyID0gIlBHIiwgc3RhcnRfZGF0ZSA9ICIyMDA0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAwOC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDUsIHRhdSA9IDAuMDEsIHV2X2xpc3QgPSB1dl9jYXZfbGlzdCkKY2F2X3NpbXVsID0gZnVuY3Rpb24oc3ltYm9sX2xpc3QsIHJlc3BfdmFyLCBjb21wbF9jYXNlID0gMSwgYWRqX2Nsb3NlID0gMSwgcmVzcF9hZGpfY2xvc2UgPSAxLCBzdGFydF9kYXRlID0gIjE5MDAtMDEtMDEiLCBlbmRfZGF0ZSA9IFN5cy5EYXRlKCksIG52YWwsIG50ZXN0LCB0YXUsIGxvd19tID0gMSwgaGlnaF9tLCBsb3dfcCA9IDEsIGhpZ2hfcCwgdXZfbGlzdCA9IE5VTEwsIG5vX3J1biA9IGMoMCwwLDAsMCksIG5hX2ludGVycCA9IFRSVUUsIHByaW50X21kbCA9IDAsIHByaW50X21wID0gMCwgbGFnX3ByZWQgPSAxLCByb3duYW1lID0gTlVMTCwgZXhwb3J0X2NzdiA9IDEsIHBhdGgsIGZpbGVuYW1lKXsKICAjIFNlbGVjdCBkYXRhIHBhcmFtZXRlcnMsIHB1bGwgdGhlIGRhdGEsIGFuZCBwZXJjZW50IGNoYW5nZSB0aGUgZGF0YQogIGRmID0gZGlmZl9pbmRleF9kZihzeW1ib2xfbGlzdCA9IHN5bWJvbF9saXN0LCByZXNwX3ZhciA9IHJlc3BfdmFyLCBjb21wbF9jYXNlID0gY29tcGxfY2FzZSwgYWRqX2Nsb3NlID0gYWRqX2Nsb3NlLCByZXNwX2Fkal9jbG9zZSA9IHJlc3BfYWRqX2Nsb3NlLCBzdGFydF9kYXRlID0gc3RhcnRfZGF0ZSwgZW5kX2RhdGUgPSBlbmRfZGF0ZSwgbGFnX3ByZWQgPSBsYWdfcHJlZCkKICAjIFRha2UgdGhlIHBlcmNlbnQgY2hhbmdlIG9mIHRoZSBkYXRhCiAgcGNfZGYgPSBwY19kaWZmX2luZGV4KGRmKQogICMgRXh0cmFjdCB0aGUgbGVnbnRoIG9mIHRoZSBkYXRhIGZyYW1lCiAgbnIgPSB0ZXN0X2VuZCA9IG5yb3cocGNfZGYpCiAgIyBDYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSB2YWwgcGVyaW9kLCB0aGUgZW5kIG9mIHRoZSB2YWwgcGVyaW9kLCBhbmQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRlc3QgcGVyaW9kCiAgdGVzdF9vcmlnID0gdGVzdF9lbmQgLSBudGVzdAogIHZhbF9lbmQgPSB0ZXN0X29yaWcKICB2YWxfb3JpZyA9IHRlc3Rfb3JpZyAtIG52YWwKICAjIFRlc3QgZm9yIHRoZSBvcHRpbWFsIG51bWJlciBvZiBwYXJhbWV0ZXJzCiAgb3B0X3ByZWRfbmwgPSBvcHRfbSh5ID0gcGNfZGZbLDFdLCB4ID0gcGNfZGZbLC0xXSwgb3JpZyA9IHZhbF9vcmlnLCBlbmQgPSB2YWxfZW5kLCB0YXUgPSB0YXUsIGxvd19tID0gbG93X20sIGhpZ2hfbSA9IGhpZ2hfbSwgcm93bmFtZSA9IHJvd25hbWUpCiAgb3B0X3ByZWRfYXJ0MSA9IG9wdF9tcCh5ID0gcGNfZGZbLDFdLCB4ID0gcGNfZGZbLC0xXSwgb3JpZyA9IHZhbF9vcmlnLCBlbmQgPSB2YWxfZW5kLCB0YXUgPSB0YXUsIGxvd19tID0gbG93X20sIGhpZ2hfbSA9IGhpZ2hfbSwgbG93X3AgPSBsb3dfcCwgaGlnaF9wID0gaGlnaF9wLG1vZF9kaSA9IDEsIGFyX3RmID0gMSwgcHJpbnRfbWRsID0gcHJpbnRfbWRsLCBwcmludF9tcCA9IHByaW50X21wLCByb3duYW1lID0gcm93bmFtZSkKICBvcHRfcHJlZF9hcnQyID0gb3B0X21wKHkgPSBwY19kZlssMV0sIHggPSBwY19kZlssLTFdLCBvcmlnID0gdmFsX29yaWcsIGVuZCA9IHZhbF9lbmQsIHRhdSA9IHRhdSwgbG93X20gPSBsb3dfbSwgaGlnaF9tID0gaGlnaF9tLCBsb3dfcCA9IGxvd19wLCBoaWdoX3AgPSBoaWdoX3AsbW9kX2RpID0gMSwgYXJfdGYgPSAyLCBwcmludF9tZGwgPSBwcmludF9tZGwsIHByaW50X21wID0gcHJpbnRfbXAsIHJvd25hbWUgPSByb3duYW1lKQogIG9wdF9wcmVkX2FydDMgPSBvcHRfbXAoeSA9IHBjX2RmWywxXSwgeCA9IHBjX2RmWywtMV0sIG9yaWcgPSB2YWxfb3JpZywgZW5kID0gdmFsX2VuZCwgdGF1ID0gdGF1LCBsb3dfbSA9IGxvd19tLCBoaWdoX20gPSBoaWdoX20sIGxvd19wID0gbG93X3AsIGhpZ2hfcCA9IGhpZ2hfcCwgbW9kX2RpID0gMSwgYXJfdGYgPSAzLCBwcmludF9tZGwgPSBwcmludF9tZGwsIHByaW50X21wID0gcHJpbnRfbXAsIHJvd25hbWUgPSByb3duYW1lKQogICMgZ2VuX3V2X3Rlc3QocGNfZGYsIDEsIDAuMDUsIG5vX3J1biA9IGMoMSwxLDAsMSkpCiAgIyBVc2UgdGhlIGFib3ZlIGZvcmVjYXN0cyB0byBpbnB1dCBpbnRvIHRoZSBhYm92ZQogIG12X2Zjc3QgPSBtb2RfZGkocGNfZGZbLDFdLCBwY19kZlssLTFdLCBvcmlnID0gdGVzdF9vcmlnLCBtID0gb3B0X3ByZWRfbmxbWzFdXSwgdGF1ID0gdGF1LCBwcmludF9tZGwgPSBwcmludF9tZGwpCiAgbXZfZmNzdF9hcnQxID0gbW9kX2RpX3dsKHBjX2RmWywxXSwgcGNfZGZbLC0xXSwgb3JpZyA9IHRlc3Rfb3JpZywgbSA9IG9wdF9wcmVkX2FydDFbWzFdXSwgcCA9IG9wdF9wcmVkX2FydDFbWzJdXSwgdGF1ID0gdGF1LCBhcl90ZiA9IDEsIHByaW50X21kbCA9IHByaW50X21kbCkKICBtdl9mY3N0X2FydDIgPSBtb2RfZGlfd2wocGNfZGZbLDFdLCBwY19kZlssLTFdLCBvcmlnID0gdGVzdF9vcmlnLCBtID0gb3B0X3ByZWRfYXJ0MltbMV1dLCBwID0gb3B0X3ByZWRfYXJ0MltbMl1dLCB0YXUgPSB0YXUsIGFyX3RmID0gMiwgcHJpbnRfbWRsID0gcHJpbnRfbWRsKQogIG12X2Zjc3RfYXJ0MyA9IG1vZF9kaV93bChwY19kZlssMV0sIHBjX2RmWywtMV0sIG9yaWcgPSB0ZXN0X29yaWcsIG0gPSBvcHRfcHJlZF9hcnQzW1sxXV0sIHAgPSBvcHRfcHJlZF9hcnQzW1syXV0sIHRhdSA9IHRhdSwgYXJfdGYgPSAzLCBwcmludF9tZGwgPSBwcmludF9tZGwpCiAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwcmVkaWN0aW9ucwogIGlmIChpcy5udWxsKHV2X2xpc3QpID09IFRSVUUpewogICAgIyBQcmludCBhIHdhcm5pbmcKICAgIHByaW50KCJXQVJOSU5HOiBOb3Qgc3VwcGx5aW5nIGFuIGlucHV0IGRhdGEgZnJhbWUgd2lsbCByZXF1aXJlIHRoaXMgZnVuY3Rpb24gdG8gcnVuIGZvciBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lICgxaHIrKSIpCiAgICAjIENhbGwgdGhlIGZ1bmN0aW9uCiAgICAjIGdlbl91dl90ZXN0ID0gZnVuY3Rpb24oZGYsIG5mY3N0LCB0YXUsIG5vX3J1biA9IGMoMCwwLDAsMCkpewogICAgIyBwcmludChoZWFkKHBjX2RmKSkKICAgIHV2X2xpc3QgPSBnZW5fdXZfdGVzdChkZiA9IHBjX2RmLCBuZmNzdCA9IG50ZXN0LCB0YXUgPSB0YXUsIG5vX3J1biA9IG5vX3J1bikKICAgICMgQWRkIHRvIGEgZGF0YSBmcmFtZQogICAgIyBJbmNvcnBvcmF0ZSB0aGUgcm9sbGluZyBwcmVkaWN0aW9ucyBmdW5jdGlvbiByZXN1bHRzIGhlcmUKICBwbG90X21hdCA9IGNiaW5kKHBjX2RmWyh0ZXN0X29yaWcrMSk6bnJvdyhwY19kZiksMV0sIG12X2Zjc3QkeWhhdFsxOm50ZXN0XSwgbXZfZmNzdF9hcnQxJHloYXRbMTpudGVzdF0sIG12X2Zjc3RfYXJ0MiR5aGF0WzE6bnRlc3RdLCBtdl9mY3N0X2FydDMkeWhhdFsxOm50ZXN0XSwgdXZfbGlzdFtbMV1dWyh0ZXN0X29yaWcrMSk6dGVzdF9lbmRdKigtMSksIHV2X2xpc3RbWzJdXVsodGVzdF9vcmlnKzEpOnRlc3RfZW5kXSooLTEpLCB1dl9saXN0W1szXV1bKHRlc3Rfb3JpZysxKTp0ZXN0X2VuZF0qKC0xKSwgdXZfbGlzdFtbNF1dWyh0ZXN0X29yaWcrMSk6dGVzdF9lbmRdKigtMSkpCiAgfSBlbHNlIHsKICAgICMgQXNzaWduIHRoZSBjb2x1bW5zIG9mIHRoZSBkYXRhIGZyYW1lCiAgICAjIGhlYWQodmFyXzVwY18yMDEwX3VzZXRmW1sxXV1bLDY6OV0pCiAgICAjIG1vZGVsIHR5cGUgKDEgLSBTQVYsIDIgLSBBUywgMyAtIEdBUkNILCA0IC0gQURBUFRJVkUpIAogICAgIyB0ZXN0X2RmID0gaGVhZCh2YXJfNXBjXzIwMTBfdXNldGZbWzFdXVssNjo5XSkKICAgICMgdGVzdF9kZiRTQVYKICAgICMgdGVzdF9kZiRgQWJzLiBTbG9wZWAKICAgICMgdGVzdF9kZiRgSW5kLiBHQVJDSGAKICAgICMgdGVzdF9kZiRBZGFwdGl2ZQogICAgcGxvdF9tYXQgPSBjYmluZChwY19kZlsodGVzdF9vcmlnKzEpOm5yb3cocGNfZGYpLDFdLCBtdl9mY3N0JHloYXRbMTpudGVzdF0sIG12X2Zjc3RfYXJ0MSR5aGF0WzE6bnRlc3RdLCBtdl9mY3N0X2FydDIkeWhhdFsxOm50ZXN0XSwgbXZfZmNzdF9hcnQzJHloYXRbMTpudGVzdF0sIHV2X2xpc3QkU0FWLCB1dl9saXN0JGBBYnMuIFNsb3BlYCwgdXZfbGlzdCRgSW5kLiBHQVJDSGAsIHV2X2xpc3QkQWRhcHRpdmUpCiAgfQogICMgQ291bnQgdGhlIE5BcyBhbmQgcHJpbnQgYSB3YXJuaW5nCiAgcHJpbnQocGFzdGUoIk5PVEU6IFRoZXJlIGFyZSAiLCBzdW0oaXMubmEocGxvdF9tYXQpKSwgIiBOQShzKSBpbiB0aGUgZGF0YXNldCIsIHNlcCA9ICIiKSkKICAjIExpbmVhcmx5IGludGVycG9sYXRlIHRoZSBOQXMKICBpZiAobmFfaW50ZXJwID09IFRSVUUpewogICAgIyBBc3NpZ24gdGhlIHBsb3QgbWF0cml4IHRvIGEgbmV3IHZhbHVlCiAgICBwbG90X21hdF9uYSA8LSBwbG90X21hdAogICAgIyBQcmludCBhIHdhcm5pbmcKICAgIHByaW50KCJXQVJOSU5HOiBUaGVyZSB3ZXJlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBwbG90IG1hdHJpeC4iKQogICAgIyBJbnRlcnBvbGF0ZSB0aGUgTkEncwogICAgZm9yIChpIGluIDE6bmNvbChwbG90X21hdF9uYSkpewogICAgICAjIEludGVycG9sYXRlIHRoZSBkYXRhCiAgICAgIHBsb3RfbWF0WyxpXSA8LSBuYS5hcHByb3gocGxvdF9tYXRfbmFbLGldKQogICAgfQogIH0KICAjIG1vZGVsIHR5cGUgKDEgLSBTQVYsIDIgLSBBUywgMyAtIEdBUkNILCA0IC0gQURBUFRJVkUpCiAgIyBBZGQgZGVzY3JpcHRpdmUgdGl0bGVzIG9udG8gdGhlIHBsb3RfbWF0CiAgY29sbmFtZXMocGxvdF9tYXQpIDwtIGMocmVzcF92YXIsICJNViBDQVZpYVIiLCAiTVYgQ0FWaWFSICsgQVIiLCAiTVYgQ0FWaWFSICsgU0FWIiwgIk1WIENBVmlhUiArIEFTIiwgIlNBViIsICJBYnMuIFNsb3BlIiwgIkluZC4gR0FSQ0giLCAiQWRhcHRpdmUiKQogICMgY29sbmFtZXMocGxvdF9tYXQpIDwtIGMoIlNQWSIsICJNViBDQVZpYVIiLCAiTVYgQ0FWaWFSICsgQVIiLCAiTVYgQ0FWaWFSICsgU0FWIiwgIk1WIENBVmlhUiArIEFTIiwgIlNBViIsICJBYnMuIFNsb3BlIiwgIkluZC4gR0FSQ0giLCAiQWRhcHRpdmUiKQogICMgUGxvdCBldmVyeXRoaW5nCiAgcGxvdCA9IHBsdF9kYXRhKHBsb3RfbWF0LCB0YXUgPSB0YXUsIHJlc3BfdmFyID0gcmVzcF92YXIsIG50ZXN0ID0gbnRlc3QpCiAgIyBDYWxjdWxhdGUgbG9zc2VzCiAgbF9saXN0ID0gZ2VuX2xvc3NfdGVzdChwbG90X21hdCwgdGF1ID0gdGF1KQogICMgUHV0IGludG8gdGFibGVzCiAgdGFibGVzID0gcHJldHR5X3RhYmxlcyhwbG90X21hdCwgbF9saXN0LCB0YXUgPSB0YXUsIG50ZXN0ID0gbnRlc3QpCiAgIyBSdW4gdGhlIGZ1bmN0aW9uIGZvciBvcHRpbWFsIHAgYW5kIG0KICBwbV90YWJsZSA9IHByZXR0eV9wbShvcHRfcHJlZF9ubFtbM11dLCBvcHRfcHJlZF9hcnQxW1s0XV0sIG9wdF9wcmVkX2FydDJbWzRdXSwgb3B0X3ByZWRfYXJ0M1tbNF1dKQogICMgRXhwb3J0IHRoZSBtYXRyaXgKICBpZiAoZXhwb3J0X2NzdiA9PSAxKXsKICAgIGV4cF9mdW5jKHZhcl9maWxlID0gcGxvdF9tYXQsIHBhdGgsIGZpbGVuYW1lKQogIH0KICAjIFByaW50IHRoZSB0YWJsZXMgYW5kIHRoZSBwbG90CiAgcHJpbnQocGxvdCkKICBwcmludCh0YWJsZXMpCiAgcHJpbnQocG1fdGFibGUpCiAgcmV0dXJuKGxpc3QocGxvdF9tYXQsIHBsb3QsIGxfbGlzdCwgdGFibGVzLCBwbG90X21hdF9uYSwgcG1fdGFibGUpKQp9CmBgYAoKCgojIFNlY3RvciBFVEZzIGFzIEV4cGxhbmF0b3J5IFZhcmlhYmxlcwoKSGVyZSdzIHdoYXQgSSdtIHRoaW5raW5nLgoKTG93ZXN0IGxldmVsOiAxJSwgNSUsIDEwJSBWYVIKTmV4dCwgMjAwOCwgMjAxMCwgMjAxNCwgb3IgMjAxNgpIaWdoZXN0IC0gRVRGIGNob2ljZXMKMyB4IDQgeCA1ID0gNjAgcnVucwoKYGBge3J9CiMgSW1wb3J0IHRoZSBkYXRhIGZyb20gQ1NWJ3MKCiMgYWJjID0gcmVhZC5jc3YoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvdmFyXzFwY18yMDA4X3VzZXRmLmNzdiIsIHNlcCA9ICIsIiwgaGVhZGVyID0gVCkKIyBoZWFkKGFiYykKIyBhcy54dHMoYWJjLCBvcmRlci5ieSA9IGFiY1ssMV0pCgojIHRlc3QxIDwtIHJlYWQuem9vKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zL3Zhcl8xcGNfMjAwOF91c2V0Zi5jc3YiLCBzZXAgPSAiLCIsICBpbmRleC5jb2x1bW4gPTAsIGhlYWRlciA9IFQpCiMgZGF0X3pvbyA8LSByZWFkLnpvbygiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy92YXJfMXBjXzIwMDhfdXNldGYuY3N2IiwgaW5kZXguY29sdW1uPTAsIHNlcD0iLCIsIGhlYWRlciA9IFQsIGZvcm1hdD0iJW0vJWQvJVkiKQojIGRhdF96b28gPC0gcmVhZC56b28oIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvdmFyXzFwY18yMDA4X3VzZXRmLmNzdiIsIGluZGV4LmNvbHVtbj0wLCBzZXA9IiwiLCBoZWFkZXIgPSBULCBGVU49YXMueWVhcm1vbikKIyB0ZXN0MQojIGRhdF94dHMgPSBhcy54dHMoZGF0X3pvbywgb3JkZXIuYnkgPSBkYXRfem9vWywxXSkKCmBgYAoKIyBJbXBvcnRpbmcgYW5kIFJ1bm5pbmcgRGF0YXNldHMKCmBgYHtyfQojIE1lc3MgYXJvdW5kIGNvZGUgLSBpdCB3b3JrcyEKYWJjID0gcmVhZC5jc3YoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvdmFyXzFwY18yMDA4X3VzX2V0Zi5jc3YiLCBzZXAgPSAiLCIsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKYWJjJEluZGV4ID0gYXMuRGF0ZShhYmMkSW5kZXgpCiMgYWJjJGluZGV4X3QgPSBhcy5QT1NJWGN0KGFiYyRJbmRleCwgZm9ybWF0ID0gIiVZLSVtLSVkIikKIyBpbmRleF90CiMgaGVhZChhYmMpCmFiY194ID0geHRzKGFiY1ssLTFdLCBvcmRlci5ieSA9IGFiY1ssMV0pCiMgaGVhZChhYmNfeCkKYGBgCgpgYGB7cn0KIycgQSBmdW5jdGlvbiB0byBpbnB1dCB0aGUgVmFSIGZpbGVzLCBwbG90IHRoZW0gYW5kIGdlbmVyYXRlIHRhYmxlcwojJwojJyBAcGFyYW0gZmlsZV9wYXRoIC0gZmlsZSBwYXRoIHRvIHVzZQojJyBAcGFyYW0gZmlsZW5hbWUgLSBuYW1lIG9mIHRoZSBmaWxlCiMnIEBwYXJhbSB0YXUgLSBxdWFudGlsZSB0byB1c2UKIycgQHBhcmFtIHJlc3BfdmFyIC0gcmVzcG9uc2UgdmFyaWFibGUgdG8gdXNlIGluIHRoZSBwbG90CiMnIEBwYXJhbSBudGVzdCAtIG51bWJlciBvZiB0ZXN0IHBvaW50cwojJyBAcGFyYW0gY25faW5wdXQgLSBjb2x1bW4gbmFtZSBpbnB1dHMKIycKIycgQHJldHVybiAtIGEgbGlzdCBvZiB0aGUgeHRzIGZpbGUsIHRoZSBwbG90LCB0aGUgbG9zcyBsaXN0LCBhbmQgdGFibGVzCiMnIEBleHBvcnQgLSBhIHBsb3QgYW5kIHRhYmxlcwojJwojJyBAZXhhbXBsZXMgLSB0ZXN0ID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzFwY18yMDA4X3VzX2V0Zi5jc3YiLCAwLjAxKQp2YXJfaW5wdXRfZGlzcCA9IGZ1bmN0aW9uKGZpbGVfcGF0aCwgZmlsZW5hbWUsIHRhdSwgcmVzcF92YXIgPSAiU1BZIiwgbnRlc3QgPSAyNTAsIGNuX2lucHV0ID0gYygiU1BZIiwgIk0xIiwgIk0yIiwgIk0zIiwgIk00IiwgIk01IiwgIk02IiwgIk03IiwgIk04IikpewojIHZhcl9pbnB1dF9kaXNwID0gZnVuY3Rpb24oZmlsZV9wYXRoLCBmaWxlbmFtZSwgdGF1LCByZXNwX3ZhciA9ICJTUFkiLCBudGVzdCA9IDI1MCwgY25faW5wdXQgPSBjKCJTUFkiLCAiTVYgQ0FWaWFSIiwgIk1WIENBVmlhUiArIEFSIiwgIk1WIENBVmlhUiArIFNBViIsICJNViBDQVZpYVIgKyBBUyIsICJTQVYiLCAiQWJzLiBTbG9wZSIsICJJbmQuIEdBUkNIIiwgIkFkYXB0aXZlIikpewogICMgSW1wb3J0IGRhdGEKICBwbG90X21hdCA9IHJlYWQuY3N2KHBhc3RlMChmaWxlX3BhdGgsZmlsZW5hbWUpLCBzZXAgPSAiLCIsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAjIEZpeCBkYXRlIGZvcm1hdAogIHBsb3RfbWF0JEluZGV4ID0gYXMuRGF0ZShwbG90X21hdCRJbmRleCkKICAjIENvbnZlcnQgdG8gYW4geHRzCiAgcGxvdF9tYXQgPSB4dHMocGxvdF9tYXRbLC0xXSwgb3JkZXIuYnkgPSBwbG90X21hdFssMV0pCiAgIyBGaXggY29sdW1uIG5hbWVzCiAgY29sbmFtZXMocGxvdF9tYXQpIDwtIGNuX2lucHV0CiAgIyBQbG90IGV2ZXJ5dGhpbmcKICBwbG90ID0gcGx0X2RhdGEocGxvdF9tYXQsIHRhdSA9IHRhdSwgcmVzcF92YXIgPSByZXNwX3ZhciwgbnRlc3QgPSBudGVzdCkKICAjIENhbGN1bGF0ZSBsb3NzZXMKICBsX2xpc3QgPSBnZW5fbG9zc190ZXN0KHBsb3RfbWF0LCB0YXUgPSB0YXUpCiAgIyBQdXQgaW50byB0YWJsZXMKICB0YWJsZXMgPSBwcmV0dHlfdGFibGVzKHBsb3RfbWF0LCBsX2xpc3QsIHRhdSA9IHRhdSwgbnRlc3QgPSBudGVzdCkKICAjIFByaW50IHRoZSB0YWJsZXMgYW5kIHRoZSBwbG90CiAgcHJpbnQocGxvdCkKICBwcmludCh0YWJsZXMpCiAgIyBwcmludChwbV90YWJsZSkKICAjIFJldHVybiB0aGUgeHRzLCB0aGUgcGxvdCwgdGhlIGxvc3MgbGlzdCwgYW5kIHRoZSB0YWJsZXMKICByZXR1cm4obGlzdChwbG90X21hdCwgcGxvdCwgbF9saXN0LCB0YWJsZXMpKQp9CmBgYAoKYGBge3J9CiMgdGVzdCA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xcGNfMjAwOF91c19ldGYuY3N2IiwgMC4wMSkKYGBgCgojIFByb2JsZW0gU29sdmluZyBvbiA0LjI5LjIwMjAKCmBgYHtyfQojIENyZWF0ZSBhIGZha2UgZGF0YSBmcmFtZSwgYW5kIGFzc2lnbiBzaWxseSBudW1iZXJzCmRmX0ZBS0UgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKDEsMiwzLDQpKQpyb3duYW1lcyhkZl9GQUtFKSA8LSBjKCJOdW1iZXJzIikKY29sbmFtZXMoZGZfRkFLRSkgPC0gYygiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIikKZGZfRkFLRSAlPiUga2FibGUoY2FwdGlvbiA9ICJGYWtlIERhdGEiLCBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGKSAlPiUga2FibGVfc3R5bGluZygpICU+JSBmb290bm90ZShnZW5lcmFsID0gcGFzdGUoIkNhbGN1bGF0ZWQgdXNpbmciLCA0LCAiZmFrZSBkYXRhIHBvaW50cyIpKQoKIyBkZiAlPiUga2FibGUoY2FwdGlvbiA9IHBhc3RlKCJDb21wYXJpc29uIG9mIFZhUiBNZXRob2RzIGZvciBhICIsIHRhdSoxMDAsICIlIFZhUiIsIHNlcCA9ICIiKSwgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikgJT4lIGthYmxlX3N0eWxpbmcoKSAlPiUgZm9vdG5vdGUoZ2VuZXJhbCA9IHBhc3RlKCJDYWxjdWxhdGVkIHVzaW5nIiwgbnRlc3QsICJ0cmFkaW5nIGRheXMgZnJvbSIsIGFzLkRhdGUoc3RhcnQpLCAidG8iLCBhcy5EYXRlKGVuZCkpKQpgYGAKCgojIyAyMDA4IEVuZGluZwoKIyMjIFUuUy4gRVRGcwoKYGBge3J9CiMgcmV0dXJuKGxpc3QocGxvdF9tYXQsIHBsb3QsIGxfbGlzdCwgdGFibGVzKSkKCiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAwOF91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xcGNfMjAwOF91c19ldGYuY3N2IiwgMC4wMSkKcHJldHR5X3RhYmxlcyh2MV8yMDA4X3VzZXRmW1sxXV0sIHYxXzIwMDhfdXNldGZbWzNdXSwgdGF1ID0gMC4wMSwgbnRlc3QgPSAyNTApCnY1XzIwMDhfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMDhfdXNfZXRmLmNzdiIsIDAuMDUpCnYxMF8yMDA4X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAwOF91c19ldGYuY3N2IiwgMC4xMCkKCiMgaGVhZCh2MTBfMjAwOF91c2V0ZltbMV1dKQp2MTBfMjAwOF91c2V0ZgpgYGAKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMDggLSAxc3Qgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMDhfdXNfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMDgtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA5LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMDhfdXNfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMDhfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDA4X3VzX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gOSwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMDhfdXNfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMDhfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAwOF91c19ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAwOC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDksIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzEwcGNfMjAwOF91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMDhfdXNldGZbWzFdXSkKYGBgCgojIyMgR2xvYmFsIEVURnMKCmBgYHtyfQojIENhbGwgdGhlIGFib3ZlIGZ1bmN0aW9uCnYxXzIwMDhfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzFwY18yMDA4X2dsb2JfZXRmLmNzdiIsIDAuMDEpCnY1XzIwMDhfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzVwY18yMDA4X2dsb2JfZXRmLmNzdiIsIDAuMDUpCnYxMF8yMDA4X2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMDhfZ2xvYl9ldGYuY3N2IiwgMC4xMCkKYGBgCgpgYGB7cn0KIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDA4IC0gMm5kIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDA4X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIHRhdSA9IDAuMDEsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDA4X2dsb2JfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMDhfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDA4X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4wNSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMDhfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAwOF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDA4X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDA4X2dsb2JfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDA4X3VzZXRmW1sxXV0pCmBgYAoKIyMjIENvbW1vZGl0eSBFVEZzCgpgYGB7cn0KIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDA4IC0gM3JkIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDA4X2NvbW1fZXRmID0gY2F2X3NpbXVsKGMoIkRCQSIsICJEQkMiLCAiREJFIiwgIkRCQiIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMDhfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAwOF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMDhfY29tbV9ldGYgPSBjYXZfc2ltdWwoYygiREJBIiwgIkRCQyIsICJEQkUiLCAiREJCIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMDgtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2NvbW1fRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDA4X2NvbW1fZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMDhfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAwOF9jb21tX2V0ZiA9IGNhdl9zaW11bChjKCJEQkEiLCAiREJDIiwgIkRCRSIsICJEQkIiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAwOC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDA4X2NvbW1fZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDA4X3VzZXRmW1sxXV0pCmBgYAoKCgojIyMgQm9uZCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDA4X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl8xcGNfMjAwOF9ib25kX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDA4X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl81cGNfMjAwOF9ib25kX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAwOF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDA4X2JvbmRfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgaVNoYXJlcyAxLTMgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKFNIWSkKIyBpU2hhcmVzIDctMTAgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKElFRikKIyBpU2hhcmVzIDIwKyBZZWFyIFRyZWFzdXJ5IEJvbmQgRnVuZCAoVExUKQojIGlTaGFyZXMgaUJveHggJCBJbnZlc3RtZW50IEdyYWRlIENvcnBvcmF0ZSBCb25kIEVURiAoTFFEKQoKIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDA4IC0gNHRoIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDA4X2JvbmRfZXRmID0gY2F2X3NpbXVsKGMoIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMDhfYm9uZF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAwOF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMDhfYm9uZF9ldGYgPSBjYXZfc2ltdWwoYygiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMDgtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDA4X2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMDhfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAwOF9ib25kX2V0ZiA9IGNhdl9zaW11bChjKCJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAwOC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDA4X2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDA4X3VzZXRmW1sxXV0pCmBgYAoKIyMjIEFsbCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDA4X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMDhfYWxsX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDA4X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMDhfYWxsX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAwOF9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAwOF9hbGxfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAwOCAtIDV0aCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAwOF9hbGxfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiwgIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIsICJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA0LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAwOC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDIzLCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDA4X2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAwOF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMDhfYWxsX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIsICJKWEkiLCAiS1hJIiwgIklYSiIsICJJWFAiLCAiSVhOIiwgIlJYSSIsICJFWEkiLCAiSVhHIiwgIk1YSSIsICJJWEMiLCAiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMDgtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAyMywgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDA4X2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAwOF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDA4X2FsbF9ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiLCAiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiwgIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDQtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDA4LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMjMsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMDhfYWxsX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAwOF91c2V0ZltbMV1dKQpgYGAKCiMjIDIwMTAgRW5kaW5nCgojIyMgVS5TLiBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDEwX3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzFwY18yMDEwX3VzX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDEwX3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzVwY18yMDEwX3VzX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxMF91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTBfdXNfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAxMCAtIDFzdCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAxMF91c19ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA2LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxMC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDksIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIHRhdSA9IDAuMDEsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xcGNfMjAxMF91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTBfdXNfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA5LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxMF91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDEwX3VzX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDYtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDEwLTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gOSwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDEwX3VzX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAxMF91c2V0ZltbMV1dKQpgYGAKCiMjIyBHbG9iYWwgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxMF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTBfZ2xvYl9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxMF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTBfZ2xvYl9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTBfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxMF9nbG9iX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTAgLSAybmQgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTBfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTBfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTBfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxMF9nbG9iX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzVwY18yMDEwX3VzZXRmW1sxXV0pCgojIHZhcl8xMHBjXzIwMTBfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTBfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTBfdXNldGZbWzFdXSkKYGBgCgojIyMgQ29tbW9kaXR5IEVURnMKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTAgLSAzcmQgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTBfY29tbV9ldGYgPSBjYXZfc2ltdWwoYygiREJBIiwgIkRCQyIsICJEQkUiLCAiREJCIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9jb21tX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xcGNfMjAxMF9jb21tX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzFwY18yMDEwX3VzZXRmW1sxXV0pCgojIHZhcl81cGNfMjAxMF9jb21tX2V0ZiA9IGNhdl9zaW11bChjKCJEQkEiLCAiREJDIiwgIkRCRSIsICJEQkIiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA2LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxMC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4wNSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMTBfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDEwX2NvbW1fZXRmID0gY2F2X3NpbXVsKGMoIkRCQSIsICJEQkMiLCAiREJFIiwgIkRCQiIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDYtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDEwLTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9jb21tX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTBfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTBfdXNldGZbWzFdXSkKYGBgCgojIyMgQm9uZCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDEwX2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl8xcGNfMjAxMF9ib25kX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDEwX2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl81cGNfMjAxMF9ib25kX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxMF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDEwX2JvbmRfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgaVNoYXJlcyAxLTMgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKFNIWSkKIyBpU2hhcmVzIDctMTAgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKElFRikKIyBpU2hhcmVzIDIwKyBZZWFyIFRyZWFzdXJ5IEJvbmQgRnVuZCAoVExUKQojIGlTaGFyZXMgaUJveHggJCBJbnZlc3RtZW50IEdyYWRlIENvcnBvcmF0ZSBCb25kIEVURiAoTFFEKQoKIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDEwIC0gNHRoIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDEwX2JvbmRfZXRmID0gY2F2X3NpbXVsKGMoIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDYtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDEwLTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTBfYm9uZF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTBfYm9uZF9ldGYgPSBjYXZfc2ltdWwoYygiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDEwX2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMTBfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAxMF9ib25kX2V0ZiA9IGNhdl9zaW11bChjKCJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA2LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxMC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDEwX2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDEwX3VzZXRmW1sxXV0pCmBgYAoKIyMjIEFsbCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDEwX2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTBfYWxsX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDEwX2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTBfYWxsX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxMF9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxMF9hbGxfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAxMCAtIDV0aCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAxMF9hbGxfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiwgIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIsICJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDA2LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxMC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDIzLCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDEwX2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTBfYWxsX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIsICJKWEkiLCAiS1hJIiwgIklYSiIsICJJWFAiLCAiSVhOIiwgIlJYSSIsICJFWEkiLCAiSVhHIiwgIk1YSSIsICJJWEMiLCAiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAwNi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTAtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAyMywgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDEwX2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxMF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDEwX2FsbF9ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiLCAiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiwgIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMDYtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDEwLTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMjMsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTBfYWxsX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAxMF91c2V0ZltbMV1dKQpgYGAKCiMjIDIwMTQgRW5kaW5nCgojIyMgVS5TLiBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDE0X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzFwY18yMDE0X3VzX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDE0X3VzZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwidmFyXzVwY18yMDE0X3VzX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxNF91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTRfdXNfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAxNCAtIDFzdCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAxNF91c19ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEwLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDksIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIHRhdSA9IDAuMDEsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xcGNfMjAxNF91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTRfdXNfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA5LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxNF91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDE0X3VzX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTAtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE0LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gOSwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDE0X3VzX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAxNF91c2V0ZltbMV1dKQpgYGAKCiMjIyBHbG9iYWwgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNF9nbG9iZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTRfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNF9nbG9iX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTQgLSAybmQgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTRfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTRfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxNF9nbG9iX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzVwY18yMDE0X3VzZXRmW1sxXV0pCgojIHZhcl8xMHBjXzIwMTRfZ2xvYl9ldGYgPSBjYXZfc2ltdWwoYygiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAxMCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTRfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTRfdXNldGZbWzFdXSkKYGBgCgojIyMgQ29tbW9kaXR5IEVURnMKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTQgLSAzcmQgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTRfY29tbV9ldGYgPSBjYXZfc2ltdWwoYygiREJBIiwgIkRCQyIsICJEQkUiLCAiREJCIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9jb21tX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xcGNfMjAxNF9jb21tX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzFwY18yMDE0X3VzZXRmW1sxXV0pCgojIHZhcl81cGNfMjAxNF9jb21tX2V0ZiA9IGNhdl9zaW11bChjKCJEQkEiLCAiREJDIiwgIkRCRSIsICJEQkIiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEwLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4wNSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMTRfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDE0X2NvbW1fZXRmID0gY2F2X3NpbXVsKGMoIkRCQSIsICJEQkMiLCAiREJFIiwgIkRCQiIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTAtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE0LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjEwLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9jb21tX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTRfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTRfdXNldGZbWzFdXSkKYGBgCgojIyMgQm9uZCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDE0X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl8xcGNfMjAxNF9ib25kX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDE0X2JvbmRldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsInZhcl81cGNfMjAxNF9ib25kX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxNF9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDE0X2JvbmRfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgaVNoYXJlcyAxLTMgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKFNIWSkKIyBpU2hhcmVzIDctMTAgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKElFRikKIyBpU2hhcmVzIDIwKyBZZWFyIFRyZWFzdXJ5IEJvbmQgRnVuZCAoVExUKQojIGlTaGFyZXMgaUJveHggJCBJbnZlc3RtZW50IEdyYWRlIENvcnBvcmF0ZSBCb25kIEVURiAoTFFEKQoKIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDE0IC0gNHRoIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDE0X2JvbmRfZXRmID0gY2F2X3NpbXVsKGMoIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTAtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE0LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTRfYm9uZF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTRfYm9uZF9ldGYgPSBjYXZfc2ltdWwoYygiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDE0X2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMTRfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAxNF9ib25kX2V0ZiA9IGNhdl9zaW11bChjKCJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEwLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDE0X2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDE0X3VzZXRmW1sxXV0pCmBgYAoKIyMjIEFsbCBFVEZzCgpgYGB7cn0KIyBDYWxsIHRoZSBhYm92ZSBmdW5jdGlvbgp2MV8yMDE0X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTRfYWxsX2V0Zi5jc3YiLCAwLjAxKQp2NV8yMDE0X2FsbGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTRfYWxsX2V0Zi5jc3YiLCAwLjA1KQp2MTBfMjAxNF9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNF9hbGxfZXRmLmNzdiIsIDAuMTApCmBgYAoKYGBge3J9CiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAxNCAtIDV0aCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAxNF9hbGxfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiwgIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIsICJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEwLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNC0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDIzLCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDE0X2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTRfYWxsX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIsICJKWEkiLCAiS1hJIiwgIklYSiIsICJJWFAiLCAiSVhOIiwgIlJYSSIsICJFWEkiLCAiSVhHIiwgIk1YSSIsICJJWEMiLCAiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMC0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTQtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAyMywgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDE0X2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxNF91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDE0X2FsbF9ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiLCAiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiwgIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTAtMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE0LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMjMsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xMHBjXzIwMTRfYWxsX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAxNF91c2V0ZltbMV1dKQpgYGAKCgojIyAyMDE2IEVuZGluZwoKIyMjIFUuUy4gRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNl91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl8xcGNfMjAxNl91c19ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNl91c2V0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX1VTX0VURl9ydW5zLyIsInZhcl81cGNfMjAxNl91c19ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTZfdXNldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCJ2YXJfMTBwY18yMDE2X3VzX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTYgLSAxc3Qgc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTZfdXNfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTYtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA5LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLCB0YXUgPSAwLjAxLCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTZfdXNfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDE2X3VzX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gOSwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9VU19FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMTZfdXNfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAxNl91c19ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEyLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNi0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDksIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfVVNfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzEwcGNfMjAxNl91c19ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTZfdXNldGZbWzFdXSkKYGBgCgojIyMgR2xvYmFsIEVURnMKCmBgYHtyfQojIENhbGwgdGhlIGFib3ZlIGZ1bmN0aW9uCnYxXzIwMTZfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzFwY18yMDE2X2dsb2JfZXRmLmNzdiIsIDAuMDEpCnY1XzIwMTZfZ2xvYmV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwidmFyXzVwY18yMDE2X2dsb2JfZXRmLmNzdiIsIDAuMDUpCnYxMF8yMDE2X2dsb2JldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9nbG9iX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTZfZ2xvYl9ldGYuY3N2IiwgMC4xMCkKYGBgCgpgYGB7cn0KIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDE2IC0gMm5kIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDE2X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIHRhdSA9IDAuMDEsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2dsb2JfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDE2X2dsb2JfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDE2X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4wNSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfNXBjXzIwMTZfZ2xvYl9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl81cGNfMjAxNl91c2V0ZltbMV1dKQoKIyB2YXJfMTBwY18yMDE2X2dsb2JfZXRmID0gY2F2X3NpbXVsKGMoIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMTAsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfZ2xvYl9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDE2X2dsb2JfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDE2X3VzZXRmW1sxXV0pCmBgYAoKIyMjIENvbW1vZGl0eSBFVEZzCgpgYGB7cn0KIyAxJSwgNSUsIDEwJSBWYVIgLSAyMDE2IC0gM3JkIHNldCBvZiBwcmVkaWN0b3JzCiMgdmFyXzFwY18yMDE2X2NvbW1fZXRmID0gY2F2X3NpbXVsKGMoIkRCQSIsICJEQkMiLCAiREJFIiwgIkRCQiIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMXBjXzIwMTZfY29tbV9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xcGNfMjAxNl91c2V0ZltbMV1dKQoKIyB2YXJfNXBjXzIwMTZfY29tbV9ldGYgPSBjYXZfc2ltdWwoYygiREJBIiwgIkRCQyIsICJEQkUiLCAiREJCIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTYtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMDUsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2NvbW1fRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzVwY18yMDE2X2NvbW1fZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAxNl9jb21tX2V0ZiA9IGNhdl9zaW11bChjKCJEQkEiLCAiREJDIiwgIkRCRSIsICJEQkIiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEyLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNi0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4xMCwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfY29tbV9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDE2X2NvbW1fZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMTBwY18yMDE2X3VzZXRmW1sxXV0pCmBgYAoKIyMjIEJvbmQgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNl9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfMXBjXzIwMTZfYm9uZF9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNl9ib25kZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYm9uZF9FVEZfcnVucy8iLCJ2YXJfNXBjXzIwMTZfYm9uZF9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTZfYm9uZGV0ZiA9IHZhcl9pbnB1dF9kaXNwKCIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwidmFyXzEwcGNfMjAxNl9ib25kX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCmBgYHtyfQojIGlTaGFyZXMgMS0zIFllYXIgVHJlYXN1cnkgQm9uZCBGdW5kIChTSFkpCiMgaVNoYXJlcyA3LTEwIFllYXIgVHJlYXN1cnkgQm9uZCBGdW5kIChJRUYpCiMgaVNoYXJlcyAyMCsgWWVhciBUcmVhc3VyeSBCb25kIEZ1bmQgKFRMVCkKIyBpU2hhcmVzIGlCb3h4ICQgSW52ZXN0bWVudCBHcmFkZSBDb3Jwb3JhdGUgQm9uZCBFVEYgKExRRCkKCiMgMSUsIDUlLCAxMCUgVmFSIC0gMjAxNiAtIDR0aCBzZXQgb2YgcHJlZGljdG9ycwojIHZhcl8xcGNfMjAxNl9ib25kX2V0ZiA9IGNhdl9zaW11bChjKCJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEyLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNi0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDQsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsIHRhdSA9IDAuMDEsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzFwY18yMDE2X2JvbmRfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDE2X2JvbmRfZXRmID0gY2F2X3NpbXVsKGMoIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gNCwgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCx0YXUgPSAwLjA1LCBwcmludF9tZGwgPSAxLCBwcmludF9tcCA9IDEsIHBhdGggPSAiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9ib25kX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxNl9ib25kX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzVwY18yMDE2X3VzZXRmW1sxXV0pCgojIHZhcl8xMHBjXzIwMTZfYm9uZF9ldGYgPSBjYXZfc2ltdWwoYygiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTYtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSA0LCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMTAsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2JvbmRfRVRGX3J1bnMvIiwgZmlsZW5hbWUgPSAidmFyXzEwcGNfMjAxNl9ib25kX2V0Zi5jc3YiLCB1dl9saXN0ID0gdmFyXzEwcGNfMjAxNl91c2V0ZltbMV1dKQpgYGAKCiMjIyBBbGwgRVRGcwoKYGBge3J9CiMgQ2FsbCB0aGUgYWJvdmUgZnVuY3Rpb24KdjFfMjAxNl9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzFwY18yMDE2X2FsbF9ldGYuY3N2IiwgMC4wMSkKdjVfMjAxNl9hbGxldGYgPSB2YXJfaW5wdXRfZGlzcCgiL1VzZXJzL3N0ZXZlbm1vZW4vRG9jdW1lbnRzL0dpdEh1Yi9DQVZpYVJfTVNfdGhlc2lzL0RhdGFfRXhwb3J0L1NQWV9hbGxfRVRGX3J1bnMvIiwidmFyXzVwY18yMDE2X2FsbF9ldGYuY3N2IiwgMC4wNSkKdjEwXzIwMTZfYWxsZXRmID0gdmFyX2lucHV0X2Rpc3AoIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsInZhcl8xMHBjXzIwMTZfYWxsX2V0Zi5jc3YiLCAwLjEwKQpgYGAKCmBgYHtyfQojIDElLCA1JSwgMTAlIFZhUiAtIDIwMTYgLSA1dGggc2V0IG9mIHByZWRpY3RvcnMKIyB2YXJfMXBjXzIwMTZfYWxsX2V0ZiA9IGNhdl9zaW11bChjKCJYTFUiLCAiWExQIiwgIlhMViIsICJYTEsiLCAiWExZIiwgIlhMSSIsICJYTEYiLCAiWExCIiwgIlhMRSIsICJKWEkiLCAiS1hJIiwgIklYSiIsICJJWFAiLCAiSVhOIiwgIlJYSSIsICJFWEkiLCAiSVhHIiwgIk1YSSIsICJJWEMiLCAiU0hZIiwgIklFRiIsICJUTFQiLCAiTFFEIiksIHJlc3BfdmFyID0gIlNQWSIsIHN0YXJ0X2RhdGUgPSAiMjAxMi0wMS0wMSIsIGVuZF9kYXRlID0gIjIwMTYtMTItMzEiLCBudmFsID0gMjUwLCBudGVzdCA9IDI1MCwgbG93X20gPSAxLCBoaWdoX20gPSAyMywgbG93X3AgPSAxLCBoaWdoX3AgPSAxMCwgdGF1ID0gMC4wMSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl8xcGNfMjAxNl9hbGxfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfMXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzVwY18yMDE2X2FsbF9ldGYgPSBjYXZfc2ltdWwoYygiWExVIiwgIlhMUCIsICJYTFYiLCAiWExLIiwgIlhMWSIsICJYTEkiLCAiWExGIiwgIlhMQiIsICJYTEUiLCAiSlhJIiwgIktYSSIsICJJWEoiLCAiSVhQIiwgIklYTiIsICJSWEkiLCAiRVhJIiwgIklYRyIsICJNWEkiLCAiSVhDIiwgIlNIWSIsICJJRUYiLCAiVExUIiwgIkxRRCIpLCByZXNwX3ZhciA9ICJTUFkiLCBzdGFydF9kYXRlID0gIjIwMTItMDEtMDEiLCBlbmRfZGF0ZSA9ICIyMDE2LTEyLTMxIiwgbnZhbCA9IDI1MCwgbnRlc3QgPSAyNTAsIGxvd19tID0gMSwgaGlnaF9tID0gMjMsIGxvd19wID0gMSwgaGlnaF9wID0gMTAsdGF1ID0gMC4wNSwgcHJpbnRfbWRsID0gMSwgcHJpbnRfbXAgPSAxLCBwYXRoID0gIi9Vc2Vycy9zdGV2ZW5tb2VuL0RvY3VtZW50cy9HaXRIdWIvQ0FWaWFSX01TX3RoZXNpcy9EYXRhX0V4cG9ydC9TUFlfYWxsX0VURl9ydW5zLyIsIGZpbGVuYW1lID0gInZhcl81cGNfMjAxNl9hbGxfZXRmLmNzdiIsIHV2X2xpc3QgPSB2YXJfNXBjXzIwMTZfdXNldGZbWzFdXSkKCiMgdmFyXzEwcGNfMjAxNl9hbGxfZXRmID0gY2F2X3NpbXVsKGMoIlhMVSIsICJYTFAiLCAiWExWIiwgIlhMSyIsICJYTFkiLCAiWExJIiwgIlhMRiIsICJYTEIiLCAiWExFIiwgIkpYSSIsICJLWEkiLCAiSVhKIiwgIklYUCIsICJJWE4iLCAiUlhJIiwgIkVYSSIsICJJWEciLCAiTVhJIiwgIklYQyIsICJTSFkiLCAiSUVGIiwgIlRMVCIsICJMUUQiKSwgcmVzcF92YXIgPSAiU1BZIiwgc3RhcnRfZGF0ZSA9ICIyMDEyLTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNi0xMi0zMSIsIG52YWwgPSAyNTAsIG50ZXN0ID0gMjUwLCBsb3dfbSA9IDEsIGhpZ2hfbSA9IDIzLCBsb3dfcCA9IDEsIGhpZ2hfcCA9IDEwLHRhdSA9IDAuMTAsIHByaW50X21kbCA9IDEsIHByaW50X21wID0gMSwgcGF0aCA9ICIvVXNlcnMvc3RldmVubW9lbi9Eb2N1bWVudHMvR2l0SHViL0NBVmlhUl9NU190aGVzaXMvRGF0YV9FeHBvcnQvU1BZX2FsbF9FVEZfcnVucy8iLCBmaWxlbmFtZSA9ICJ2YXJfMTBwY18yMDE2X2FsbF9ldGYuY3N2IiwgdXZfbGlzdCA9IHZhcl8xMHBjXzIwMTZfdXNldGZbWzFdXSkKYGBgCgojIENvbmNsdXNpb25zIGFuZCBGdXR1cmUgV29yawoKVGhlIHByb2JsZW0gb2YgaG93IHRvIHByZWRpY3QgYSBsb3cgcXVhbnRpbGUgb2YgYSBzdG9jaydzIGxvZyByZXR1cm4gd2hlbiB0aGUgdHJhaW5pbmcgc2FtcGxlIGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IHRoYW4gdGhlIHRlc3Qgc2NlbmFyaW8gaXMgYW4gZW5vcm1vdXNseSBkaWZmaWN1bHQgcHJvYmxlbS4gQWxtb3N0IGF4aW9tYXRpY2FsbHksIHRoZSBkaXN0cmlidXRpb24gaXMgbm9uc3RhdGlvbmFyeSBvdmVyIHRpbWUuIEhvdyBpcyBpdCBwb3NzaWJsZSB0byBwcmVkaWN0IHRoZSByZXR1cm4gb2YgYW4gaW5kZXggbGlrZSB0aGUgUyZQNTAwIGR1cmluZyBhIHBlcmlvZCBvZiBtYXJrZXQgdHVybW9pbCBzdWNoIGFzIHRoZSBncmVhdCByZWNlc3Npb24/IFdoaWxlIHRoZSBDQVZpYVIgbW9kZWwgcGVyZm9ybXMgY29tcGFyYXRpdmVseSB3ZWxsIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MsIGl0IHBlcmZvcm1zIGFib3V0IHRoZSBzYW1lIGFzIHRoZSBtdWx0aXZhcmlhdGUgbW9kZWwgZHVyaW5nIG1vcmUgYmVuaWduIGVjb25vbWljIHBlcmlvZHMuCgpUaGlzIGNvbmNsdXNpb24gZHJhd24gZnJvbSB0aGUgYWJvdmUgcmVzdWx0cyBtaWdodCBzdXBwb3J0IHRoZSBub3Rpb24gb2YgY29tYmluaW5nIHRoZSB0d28gbW9kZWxzIGluIHNvbWUgc29ydCBvZiBhIG1peHR1cmUgbW9kZWwgLSBhaW1pbmcgdG8gdXNlIHRoZSBiYXNrZXQgb2YgRVRGcyBkdXJpbmcgZ29vZCB0aW1lcywgYW5kIHVzZSB0aGUgQ0FWaWFSIEFSTUEgc3BlY2lmaWNhdGlvbiBkdXJpbmcgYmFkIHRpbWVzLiBUaGUgYXBwcm9hY2ggb2YgdXNpbmcgRVRGcyBhbGxvd3MgYSBwcmVkaWN0aW9uIGJhc2VkIG9uIGZvcndhcmQtbG9va2luZyBleHBlY3RhdGlvbnMgb2YgZnVuZGFtZW50YWwgZmFjdG9ycy4gSW5kZWVkLCBFVEZzIGFyZSBqdXN0IGJhc2tldHMgb2YgaW5kaXZpZHVhbCBzdG9ja3Mgb3IgYm9uZHMsIGFuZCB0aG9zZSBzZWN1cml0aWVzIGFyZSAoaW4gdGhlb3J5KSBiYXNlZCBvbiByYXRpb25hbCBleHBlY3RhdGlvbnMgYWJvdXQgZnV0dXJlIHJlc291cmNlcywgbWFya2V0IGNvbmRpdGlvbnMsIGV0YyAtIHRoZSBtaWNyb2ZvdW5kYXRpb25zIG9mIHdoYXQgZHJpdmVzIG91ciBlY29ub215LiBUaGUgQVJNQSBzcGVjaWZpY2F0aW9uLCB3aGlsZSBwcmFjdGljYWxseSBhbmQgc3RhdGlzdGljYWxseSBzb3VuZCwgaXMgY29udHJhZGljdGVkIGJ5IGVjb25vbWljIHRoZW9yeSBhbmQgcHJhY3RpY2UgLSB0aGUgd2VhayBmb3JtIG9mIHRoZSBlZmZpY2llbnQgbWFya2V0IGh5cG90aGVzaXMgc3RhdGVzIHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0byBmb3JlY2FzdCBmdXR1cmUgdmFsdWVzIG9mIGFzc2V0IHByaWNlcyB1c2luZyBwYXN0IHZhbHVlcy4gQnV0IHBlcmhhcHMgdGhpcyB2aWV3IGlzIGluY29tcGxldGUuCgpBbnkgbW9kZWwgdGhhdCBhdHRlbXB0cyB0byBjYXB0dXJlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHJlYWwgd29ybGQgd2lsbCBvbmx5IHdvcmsgdW50aWwgYW4gb21pdHRlZCB2YXJpYWJsZSBpcyBmb3VuZC4gVGhlIGVsZWdhbmNlIG9mIHRoZSBtdWx0aXZhcmlhdGUgQ0FWaWFSIG1vZGVsIGlzIHRoYXQgaXQgcHJvdmlkZXMgaW5zaWdodCBpbnRvIHdoeSBhIHByZWRpY3Rpb24gaXMgd3Jvbmc7IHRoZSBjaGFuZ2UgaW4gdGhlIGFuZ2xlIGJldHdlZW4gcmVzdWx0YW50IHZlY3RvcnMgaXMgYSBzZW5zaWJsZSBtZWFzdXJlbWVudCBvZiBlY29ub21pYyBjaGFuZ2Vwb2ludHMgKENIQU5HRSkuIEhvd2V2ZXIsIGVycm9ycyBpbiB0aGUgd29ybGQgYXJlIGNvc3RseSwgYW5kIGl0J3Mgd2lzaGZ1bCB0aGlua2luZyB0byBzYXkgdGhhdCBleHBsYWluaW5nIHdoeSB0aGUgZXJyb3Igb2NjdXJlZCBpcyBzdWZmaWNpZW50LgoKQXMgc3VjaCwgZm9yIGZ1dHVyZSB3b3JrIGl0J3Mgd29ydGggZXhwbG9yaW5nIHRoZSBub3Rpb24gb2Ygd2VpZ2h0aW5nIGFuIEFSTUEtYXBwcm9hY2ggbW9yZSBoZWF2aWx5IHdoZW4gcHJlZGljdGlvbnMgdXNpbmcgZnVuZGFtZW50YWxzIHdlcmUgdG9vIGhpZ2gsIHRoZW4gbm90IG9ubHkgd291bGQgdGhpcyBhZnRlci10aGUtZmFjdCByZWNvZ25pdGlvbiBiZSBhY2hpZXZlcywgYnV0IGFsc28gYSBoaWVyYXJjaGljYWwgbW9kZWwgdGhhdCBjYXB0dXJlcyBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIGluIHRoZSBlY29ub215IGFuZCBwb3RlbnRpYWxseSBjaGFuZ2VzIG91ciB1bmRlcnN0YW5kaW5nIG9mIGFzc2V0IHByaWNlcyBpbiBnZW5lcmFsIC0gYSBzeW50aGVzaXMgYmV0d2VlbiBLZXluZXMnIGFuaW1hbCBzcGlyaXRzIGR1cmluZyBhIHRpbWUgb2Ygc2V2ZXJlIGNyaXNpczsgd2hlcmUgYSBtb2RlbCBjYW5ub3QgZXhwbGFpbiBzaGlmdHMsIGFuZCBhIG1vcmUgcmF0aW9uYWwgd29ybGQgdGhhdCBleHBsYWlucyBvdGhlciBwZXJpb2RzLiBJbiBhZGRpdGlvbiB0byBzaWduaWZpY2FudCBwcmVkaWN0aXZlIHBvd2VyIGJlY2F1c2Ugb2YgdGhlIHN3aXRjaGluZyBiZXR3ZWVuIHRoZSB0d28gd29ybGRzLCB0aGVyZSdzIGFsc28gYW4gZWxlZ2FudCBleHBsYW5hdGlvbjsgYSB3YXkgdG8gZXhwbGFpbiBjaGFuZ2VzIGluIHRoZSB1c2VmdWxuZXNzIG9mIHRoZSB1bmRlcnBpbm5pbmdzIGluIHRoZSBlY29ub215LiBCZWNhdXNlIG9mIHRoZSBmbGV4aWJpbGl0eSBvZiB0aGUgbW9kZWwsIGl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCBhIHdob2xlIGdhbXV0IG9mIHZhcmlhYmxlcyBjb3VsZCBiZSB0b3NzZWQgaW4gYW5kIGJhY2t0ZXN0ZWQgdG8gd2hlbiAiY2hhbmdlcG9pbnRzIiBvY2N1cnJlZC4KCgojIENvZGUgQXBwZW5kaXgKCmBgYHtyIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLCBlY2hvID0gVCwgZXZhbCA9IEZ9CmBgYAoKIyBMaXRlcmF0dXJlIENpdGVkCg==